我正在制作一个带有 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/