java - 如何将 JNativeHook 连接到 JavaFX 线程?

标签 java multithreading javafx

我正在制作一个带有 Javafx 图形用户界面的翻译程序。我正在使用 JNativeHook 在应用程序未处于焦点时启用全局按键监听器。当同时按下 alt 和 t 时,程序应该从任务栏恢复自身。

但是,当我按 alt 和 t 时,出现错误,指出 JNativeHook 线程无法与 javafx 线程一起运行。

是否有可能让 GlobalScreen 线程与 javafx 线程进行通信?

这是我的全局 key 监听器代码

GlobalScreen.addNativeKeyListener(listener);

这是我的听众

                @Override
                public void nativeKeyPressed(NativeKeyEvent nativeKeyEvent) {
                    if(nativeKeyEvent.getKeyCode() == NativeKeyEvent.VC_ALT_L){
                        alt = true;
                    }
                    if(nativeKeyEvent.getKeyCode() == NativeKeyEvent.VC_T){
                        t = true;
                    }

                    check();

                }

                @Override
                public void nativeKeyReleased(NativeKeyEvent nativeKeyEvent) {
                    if(nativeKeyEvent.getKeyCode() == NativeKeyEvent.VC_ALT_L){
                        alt = false;
                    }
                    if(nativeKeyEvent.getKeyCode() == NativeKeyEvent.VC_T){
                        t = false;
                    }
                }

                @Override
                public void nativeKeyTyped(NativeKeyEvent nativeKeyEvent) {

                }
            });

我得到的错误是

Exception in thread "JNativeHook Dispatch Thread" java.lang.IllegalStateException: Not on FX application thread; currentThread = JNativeHook Dispatch Thread
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:204)

如果您不熟悉 GlobalScreen,它基本上是在 Java 程序未处于焦点状态并且正在使用计算机上的其他内容时向您的 Java 程序添加一个按键监听器。

有什么方法可以让 JNativeHook 线程访问我的 javafx 线程,以便在程序最小化后使用热键重新打开程序吗?

最佳答案

只需将它们包装在 Platform.runLater 中即可使它们在 FX 线程上运行,即:

    Platform.runLater( () -> {
        if(nativeKeyEvent.getKeyCode() == NativeKeyEvent.VC_ALT_L){
            alt = true;
        }
        if(nativeKeyEvent.getKeyCode() == NativeKeyEvent.VC_T){
            t = true;
        }

        check();
    } );

关于java - 如何将 JNativeHook 连接到 JavaFX 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32063229/

相关文章:

java - 相对于 JVM 的字符串池,在 Java 中创建一个字符串的时间成本是多少?

java - 有没有一种优雅的方法来获取Java中多个方法返回的第一个非空值?

c - 如何让 pthread 在后台工作而不阻塞 shell?

python - Gevent可以和CPython中的真实线程结合使用吗?

java线程的启动方法或者方法

JavaFX、MouseEvent问题

java - 如何模拟 JButton 数组中特定 JButton 的移动

java - 是什么导致 java.lang.ArrayIndexOutOfBoundsException 以及如何防止它?

url - JavaFX 网址代理?

Java - Spring Autowired 分配 null