我有一个我想要的jbutton,只要它被一个机器人类点击一个mouseMove的无限循环。然后,再次单击时停止。当我第一次按下它时,问题出在我的代码中,它导致系统冻结,当我再次单击它时没有任何反应。我用:
boolean go = false
jb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
go = !go;
if (go)
jb.setText("Stop!");
else
jb.setText("Start!");
try {
Robot robot = new Robot();
while (go) {
robot.mouseMove(500, 500);
robot.delay(1000);
robot.mouseMove(500, 400);
}
} catch (AWTException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
答案 0 :(得分:2)
Swing是一个单线程环境。这意味着如果有任何东西阻止这个线程,Swing将无法响应新事件,包括绘制请求,并且看起来你的UI已被冻结......因为它有... ...
最简单的解决方案可能是生成一个新线程并在其中运行循环...
首先写一篇关于你想要完成的工作的Runnable
......
public class MouseRunner implements Runnable {
@Override
public void run() {
try {
Robot robot = new Robot();
while (go) {
robot.mouseMove(500, 500);
robot.delay(1000);
robot.mouseMove(500, 400);
}
} catch (AWTException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
然后,当用户首次点击该按钮时,创建一个Thread
并启动它......
jb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
go = !go;
if (go) {
jb.setText("Stop!");
Thread t = new Thread(new MouseRunner());
t.start();
} else {
jb.setText("Start!");
}
}
});
请注意,您的go
变量可能需要volatile