Javafx 和 Sun.glass 机器人由于使用线程而导致 IllegalStateException 问题

标签 java multithreading javafx

我正在编写一个 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 包中有为此目的的并发类,例如TaskWorker它本质上为您包装了一个 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/

相关文章:

multithreading - 在 QThreads 中执行双向信号

c++ - 多线程并行选择排序

image - 如何删除 JavaFX GridPane 中的 "ghost line"?

javafx 将 KeyTyped 的值存储在字符串中

java - 如何为启用 HA 的集群配置 SparkContext

java - ANDROID Sqli 游标仅返回 1 行之后它给出空异常

java - 非等间隔时间序列数据的Round Robin数据存储

c# - 将 unicode 字符串从 C# 发送到 Java

java - 如何对实现 Runnable 的类进行单元测试

java - 如何在 JavaFX 中制作 TimeSpinner?