我正在编写一个程序,可以在给定的时间内将鼠标移动一定距离。所以我需要算法:
点击开始
while(true){
move mouse to point x
sleep for n seconds
}
哪个有效,但是当作为线程运行时,仍然按下开始按钮,因为线程一直在运行。因此,我甚至不能退出该程序(与任何无限循环一样)并且我无法将布尔值设置为“false”以停止while循环。我需要做什么才能使这个线程可以在后台运行,并且仍然允许我点击停止按钮并让鼠标停止移动?
在我的主要课程中,我有:
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btnStart) {
Thread t = new Thread(new Mover(1000, true));
t.run();
}
}
线程类:
import java.awt.AWTException;
import java.awt.MouseInfo;
import java.awt.Robot;
public class Mover implements Runnable {
int time;
boolean startStop;
public Mover(int x, boolean b) {
time = x;
startStop = b;
}
@Override
public void run() {
while (startStop) {
// TODO Auto-generated method stub
//Get x position
int intX = MouseInfo.getPointerInfo().getLocation().x;
// String intx = Integer.toString(intX);
//Get y position
int intY = MouseInfo.getPointerInfo().getLocation().y;
Robot robot;
try {
robot = new Robot();
robot.mouseMove(intX - 100, intY);
} catch (AWTException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
Thread.sleep(time);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}// Close while loop
}
}
答案 0 :(得分:1)
在Mover
类中为布尔值创建一个setter:
public void setStartStop(boolean value) {
startStop = value;
}
然后在主要班级中保留对Mover
的引用。
Mover mover = new Mover(1000, true);
Thread thread = new Thread(mover);
thread.start();
//do stuff
mover.setStartStop(false);
这允许外部(即主要)线程在其运行时影响另一个线程。启动thread
后,您的主线程应该继续正常执行。