Как закрыть приложение JavaFX при закрытии окна?

в Swing вы можете просто использовать setDefaultCloseOperation() закрыть все приложение, когда окно закрыто.

однако в JavaFX я не могу найти эквивалент. У меня открыто несколько окон, и я хочу закрыть все приложение, если окно закрыто. Как это сделать в JavaFX?

Edit:

Я понимаю, что я могу переопределить setOnCloseRequest() для выполнения некоторых операций при закрытии окна. Вопрос в том, какая операция должна быть выполнена для завершения все заявление?

stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        stop();
    }
});

на stop() метод, определенный в Application класс ничего не делает.

11 ответов


приложение автоматически останавливается, когда последний Stage закрыт. В этот момент stop() метод Application вызывается класс, поэтому вам не нужен эквивалент setDefaultCloseOperation()

если вы хотите остановить приложение до этого, вы можете позвонить Platform.exit(), например в onCloseRequest звонок.

вы можете иметь всю эту информацию на странице javadoc Application : http://docs.oracle.com/javafx/2/api/javafx/application/Application.html


некоторые из предоставленных ответов не сработали для меня (javaw.exe все еще работает после закрытия окна) или eclipse показал исключение после закрытия приложения.

С другой стороны, это прекрасно работает:

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent t) {
        Platform.exit();
        System.exit(0);
    }
});

Для справки-минимальная реализация с использованием Java 8 :

@Override
public void start(Stage mainStage) throws Exception {

    Scene scene = new Scene(new Region());
    mainStage.setWidth(640);
    mainStage.setHeight(480);
    mainStage.setScene(scene);

    //this makes all stages close and the app exit when the main stage is closed
    mainStage.setOnCloseRequest(e -> Platform.exit());

    //add real stuff to the scene...
    //open secondary stages... etc...
}

stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        Platform.exit();
        System.exit(0);
    }
}

ты попробуй..setOnCloseRequest

setOnCloseRequest(EventHandler<WindowEvent> value)   

есть один пример


используя Java 8, это сработало для меня:

@Override
public void start(Stage stage) {
    Scene scene = new Scene(new Region());
    stage.setScene(scene);

    /* ... OTHER STUFF ... */

    stage.setOnCloseRequest(e -> {
        Platform.exit();
        System.exit(0);
    });
}

это, казалось, сработало для меня:

EventHandler<ActionEvent> quitHandler = quitEvent -> {

        System.exit(0);

    };
    // Set the handler on the Start/Resume button
    quit.setOnAction(quitHandler);

попробовать

 System.exit(0);

это должно завершить основной поток и завершить основную программу


для меня работает только следующее:

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent event) {



                Platform.exit();
                Thread start=new Thread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        System.exit(0);     
                    }
                });
                start.start();
            }

        });

getContentPane.удалить(jfxPanel);

попробуй (:


вы должны переопределить метод "stop ()" в экземпляре приложения, чтобы он работал. Если вы переопределили даже пустой " stop ()", то приложение изящно завершает работу после закрытия последнего этапа (на самом деле последний этап должен быть основным этапом, чтобы он работал полностью, как и должно быть). Без каких-либо дополнительных платформ.в таком случае необходимы вызовы exit или setOnCloseRequest.