为什么当我在 MouseEntered() 函数中使用 while 循环时一切都停止了?在 Java
why all thing is stop when i'll use while loop in MouseEntered() Function ?? In Java
我的 gui 程序包含 (JPanel ,JFrame ,JLabel) JLabel :我将其编码为从
(0x, 0y) 到 (200x ,0y) 逐个像素。当我将鼠标放在名为 "p" 的面板上时它会启动,但是当我尝试 运行 这个程序时它会正确启动,但是当我将鼠标放在面板所有东西都停止到几秒钟标签移动到点 (200x, 0y) 任何人都有解决这个问题的答案。
Class 有问题:-
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class JFrameClass extends JFrame{
JPanel p = new JPanel();
JLabel l = new JLabel();
public JFrameClass() {
// TODO Auto-generated constructor stub
setSize(800, 800);
setLayout(null);
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
l.setBounds(0, 0, 50, 50);
l.setBackground(new Color(16, 16, 16));
l.setOpaque(true);
p.setBounds(320, 320, 100, 100);
p.setBackground(new Color(16, 16, 16));
p.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent evt) {
boolean wd = true;
int x = 0;
while(true) {
if(x == 200) wd = false;
if(!wd) break;
l.setLocation(x, 0);
x++;
try {
Thread.sleep(10);
}catch(Exception e) {
}
}
}
});
add(p);
add(l);
setVisible(true);
}
}
主要Class那个运行JFrameClassclass:-
public class Main {
public static void main(String[] args) {
new JFrameClass();
}
}
您是 运行 您在 Event-Dispatch-Thread 上的代码。那是 no-no。将鼠标中的代码输入到一个SwingWorker中。
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
protected Void doInBackground() throws Exception {
for (int x = 0; x < 200; x++) {
l.setVisible(false);
l.setLocation(x, 0);
l.setVisible(true);
try {
Thread.sleep(10);
}catch(Exception e) {
}
}
return null;
}
};
worker.execute();
像 mouseEntered()
这样的侦听器方法预计会 return 快速,最多几毫秒,因为 Java 将仅在前一个事件处理时才开始处理下一个用户界面事件已完成。
您的 mouseEntered()
将循环 200 次,每次迭代休眠 10 毫秒。因此,Java 将暂停其完整的 UI 事件处理,直到这 2 秒过去,这意味着此时完全冻结 UI。
如果要创建移动标签,您需要使用 Timer
或类似的东西。
我的 gui 程序包含 (JPanel ,JFrame ,JLabel) JLabel :我将其编码为从 (0x, 0y) 到 (200x ,0y) 逐个像素。当我将鼠标放在名为 "p" 的面板上时它会启动,但是当我尝试 运行 这个程序时它会正确启动,但是当我将鼠标放在面板所有东西都停止到几秒钟标签移动到点 (200x, 0y) 任何人都有解决这个问题的答案。
Class 有问题:-
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class JFrameClass extends JFrame{
JPanel p = new JPanel();
JLabel l = new JLabel();
public JFrameClass() {
// TODO Auto-generated constructor stub
setSize(800, 800);
setLayout(null);
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
l.setBounds(0, 0, 50, 50);
l.setBackground(new Color(16, 16, 16));
l.setOpaque(true);
p.setBounds(320, 320, 100, 100);
p.setBackground(new Color(16, 16, 16));
p.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent evt) {
boolean wd = true;
int x = 0;
while(true) {
if(x == 200) wd = false;
if(!wd) break;
l.setLocation(x, 0);
x++;
try {
Thread.sleep(10);
}catch(Exception e) {
}
}
}
});
add(p);
add(l);
setVisible(true);
}
}
主要Class那个运行JFrameClassclass:-
public class Main {
public static void main(String[] args) {
new JFrameClass();
}
}
您是 运行 您在 Event-Dispatch-Thread 上的代码。那是 no-no。将鼠标中的代码输入到一个SwingWorker中。
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
protected Void doInBackground() throws Exception {
for (int x = 0; x < 200; x++) {
l.setVisible(false);
l.setLocation(x, 0);
l.setVisible(true);
try {
Thread.sleep(10);
}catch(Exception e) {
}
}
return null;
}
};
worker.execute();
像 mouseEntered()
这样的侦听器方法预计会 return 快速,最多几毫秒,因为 Java 将仅在前一个事件处理时才开始处理下一个用户界面事件已完成。
您的 mouseEntered()
将循环 200 次,每次迭代休眠 10 毫秒。因此,Java 将暂停其完整的 UI 事件处理,直到这 2 秒过去,这意味着此时完全冻结 UI。
如果要创建移动标签,您需要使用 Timer
或类似的东西。