JavaFX: Platform.exit (), когда есть диалоговое окно - PullRequest
0 голосов
/ 04 июня 2018

У меня есть приложение JavaFX, в котором можно одновременно открыть несколько окон.Некоторые из этих окон также могут порождать «диалоговые» окна.В то же время приложение проверяет определенные условия в фоновом режиме, и оно может немедленно вызвать Platform.exit() для завершения всего приложения.

Я создал мини-образец, показывающий, как это может произойти.

public class test extends Application {
    @Override
    public void start(final Stage primaryStage) throws Exception {
        final VBox root = new VBox();
        final Scene sc = new Scene(root);
        primaryStage.setScene(sc);
        primaryStage.show();

        // Platform.runLater is necessary because this start() must not be blocked
        Platform.runLater(() -> {
            final Button button = new Button("Exit");
            button.setOnAction(e -> Platform.exit());

            Stage st = new Stage();
            st.setScene(new Scene(button));

            st.initOwner(primaryStage);
            st.initModality(Modality.WINDOW_MODAL); // Just need window-level modality

            st.showAndWait(); // Shows the "dialog" window
        });
    }

    public static void main(final String[] args) {
        Application.launch(args);
    }
}

Исключение, возникающее при нажатии кнопки:

Exception in thread "JavaFX Application Thread" java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = JavaFX Application Thread
    at com.sun.glass.ui.Application.checkEventThread(Application.java:443)
    at com.sun.glass.ui.Application.isNestedLoopRunning(Application.java:544)
    at com.sun.javafx.tk.quantum.QuantumToolkit.isNestedLoopRunning(QuantumToolkit.java:1139)
    at com.sun.javafx.tk.quantum.QuantumToolkit.enterNestedEventLoop(QuantumToolkit.java:585)
    at javafx.stage.Stage.showAndWait(Stage.java:474)
    at test.lambda$0(test.java:43)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)

Что я могу сделать, чтобы обеспечить безопасный вызов Platform.exit()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...