Java 机器人类,无限循环中的鼠标移动
我有一个我想要的jbutton,只要它被一个机器人类点击以生成一个鼠标移动的无限循环。然后,在再次单击时停止。问题是在我的代码中,当我第一次按下它时,它会导致系统冻结,当我再次单击它时,不会发生任何事情。我使用:Java 机器人类,无限循环中的鼠标移动,java,swing,awtrobot,Java,Swing,Awtrobot,我有一个我想要的jbutton,只要它被一个机器人类点击以生成一个鼠标移动的无限循环。然后,在再次单击时停止。问题是在我的代码中,当我第一次按下它时,它会导致系统冻结,当我再次单击它时,不会发生任何事情。我使用: boolean go = false jb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { go = !go;
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();
}
}
});
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();
}
}
}
然后,当用户第一次单击按钮时,创建一个线程
,然后启动它
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
从查看