it-swarm.com.ru

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

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

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

Правка:

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

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

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

61
Kshitiz Sharma

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

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

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

70
Teocali

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

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

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

Для справки, вот минимальная реализация с использованием 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...
}
23
Pierre Henry
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        Platform.exit();
        System.exit(0);
    }
}
17
Om Prakash

Вы пробовали это .. setOnCloseRequest

setOnCloseRequest(EventHandler<WindowEvent> value)   

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

3
Sumit Singh

Используя 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);
    });
}
2
madx

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

EventHandler<ActionEvent> quitHandler = quitEvent -> {

        System.exit(0);

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

getContentPane.remove (jfxPanel); 

попытайся (:

0
Padronização S A

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

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();
            }

        });
0
Piyush Aghera

Пытаться

 System.exit(0);

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

0
DENNIS KITHINJI