我正在编写一个 JavaFX Controller ,每 5 秒移动一次鼠标。该 Controller 在执行此操作的同时还同时执行一些其他工作。因此,我为每个任务使用了单独的线程。下面是我的代码:
Thread dynamicMouseThread = new Thread(new Runnable() {
@Override
public void run() {
boolean isRunning = true;
long timeout = 5000;
int x = 5;
Robot robot = com.sun.glass.ui.Application.GetApplication().createRobot();
while (isRunning) {
try {
Thread.sleep(timeout);
} catch (InterruptedException ex) {
isRunning = false;
}
x = x == 5 ? x + 5 : 5;
robot.mouseMove(x, 5); // This line causes the error.
}
}
});
@Override
public void initialize(URL url, ResourceBundle rb) {
dynamicTimerThread.setName("Dynamic Timer Thread");
dynamicMouseThread.setName("Dynamic Mouse Thread");
dynamicTimerThread.start();
dynamicMouseThread.start();
}
这是我似乎遇到的错误。请帮帮我。我做错了什么?
Exception in thread "Dynamic Mouse Thread" java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = Dynamic Mouse Thread
at com.sun.glass.ui.Application.checkEventThread(Application.java:427)
at com.sun.glass.ui.Robot.<init>(Robot.java:52)
at com.sun.glass.ui.win.WinRobot.<init>(WinRobot.java:33)
at com.sun.glass.ui.win.WinApplication.createRobot(WinApplication.java:205)
at main.SubDocumentController$1.run(SubDocumentController.java:56)
at java.lang.Thread.run(Thread.java:745)
最佳答案
您收到的错误有点误导,它实际上应该指的是 JavaFX Application Thread ,这是对 JavaFX 对象的所有访问都必须发生的地方。
在 JavaFX 中,您不应该创建这样的线程。 javafx.concurrent
包中有为此目的的并发类,例如Task
和 Worker
它本质上为您包装了一个 Runnable 。使用Platform#runLater(Runnable)
在正确的上下文中执行这些。
因此,您的代码应如下所示:
Platform.runLater(new Runnable() {
@Override
public void run() {
// ...
Robot robot = com.sun.glass.ui.Application.GetApplication().createRobot();
// ...
robot.mouseMove(x, 5);
}
});
关于Javafx 和 Sun.glass 机器人由于使用线程而导致 IllegalStateException 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24471513/