Java 不在FX应用程序线程上;currentThread=AWT-EventQueue-0

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行)(我还测试了在热键监听器中和监听器外部显示文件选择器,如果我做了第二件事,则不会出现错误)。另外,如果我只是在热键侦听器中

因此,如果我按下CTRL+Alt+D(我正在使用),我将尝试使我的JavaFX应用程序可见。但每次我写Stage.show();在我的HotKeyListener中,我在线程“AWT-EventQueue-0”java.lang.IllegalStateException中获得
异常:不在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发现了问题