Java 不在FX应用程序线程上;currentThread=AWT-EventQueue-0
因此,如果我按下CTRL+Alt+D(我正在使用),我将尝试使我的JavaFX应用程序可见。但每次我写Stage.show();在我的HotKeyListener中,我在线程“AWT-EventQueue-0”java.lang.IllegalStateException中获得Java 不在FX应用程序线程上;currentThread=AWT-EventQueue-0,java,javafx,Java,Javafx,因此,如果我按下CTRL+Alt+D(我正在使用),我将尝试使我的JavaFX应用程序可见。但每次我写Stage.show();在我的HotKeyListener中,我在线程“AWT-EventQueue-0”java.lang.IllegalStateException中获得异常:不在FX应用程序线程上;currentThread=AWT-EventQueue-0(第7行)(我还测试了在热键监听器中和监听器外部显示文件选择器,如果我做了第二件事,则不会出现错误)。另外,如果我只是在热键侦听器中
异常:不在FX应用程序线程上;currentThread=AWT-EventQueue-0(第7行)
(我还测试了在热键监听器中和监听器外部显示文件选择器,如果我做了第二件事,则不会出现错误)。另外,如果我只是在热键侦听器中放入System.out.println(“Test”)
,而没有其他内容,它只输出它,我不会得到任何错误
public class Main extends Application {
public static Stage s;
@Override
public void start(Stage stage) throws Exception {
Scene scene = new Scene(FXMLLoader.load(getClass().getResource("Main.fxml")));
stage.setScene(scene);
stage.setTitle("Test");
stage.setResizable(false);
s = stage;
}
}
控制器:
public class Controller {
public void initialize() {
Provider provider = Provider.getCurrentProvider(true);
openSaveDialog(Main.s); //No error
HotKeyListener l = hotKey -> {
Main.s.show();
openSaveDialog(Main.s);
//Returns an error
};
provider.register(KeyStroke.getKeyStroke("control alt D"), l);
}
public File openSaveDialog(Stage s) {
FileChooser chooser = new FileChooser();
chooser.setTitle("Select the output");
return chooser.showSaveDialog(s);
}
}
如果您尝试在调用
Platform.runLater()
时包装HotKeyListener
的内容,应该可以解决这个问题。由于您正在修改JavaFX场景图,因此这项工作必须在应用程序线程上完成
HotKeyListener l=热键->{
Platform.runLater(()->{
Main.s.show();
openSaveDialog(Main.s);
});
};
虽然,您不应该使用AWT HotKeyListener,而是应该通过JavaFX的事件来注册密钥侦听器。然后您就不需要调用
Platform.runLater()
作为说明,您可以调用Platform.isFxApplicationThread()来检查代码是否在JavaFX应用程序线程或其他线程上运行。我使用jkeymaster是因为我想在不打开窗口的情况下按组合键。我没有发现任何其他问题。现在我有问题,如果我再次按下组合键,什么也没有发生?nvm发现了问题