作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个在 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/
我是一名优秀的程序员,十分优秀!