Как закрыть приложение JavaFX при закрытии окна?
В Swing вы можете просто использовать setDefaultCloseOperation()
для закрытия всего приложения, когда окно закрыто.
Однако в JavaFX я не могу найти эквивалент. У меня открыто несколько окон, и я хочу закрыть все приложение, если окно закрыто. Каков способ сделать это в JavaFX?
Edit:
Я понимаю, что я могу переопределить setOnCloseRequest()
, чтобы выполнить некоторую операцию при закрытии окна. Вопрос в том, какая операция должна выполняться для завершения всего приложения?
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
stop();
}
});
Метод stop()
, определенный в классе Application
, ничего не делает.
Ответы
Ответ 1
Приложение автоматически останавливается, когда последний Stage
закрыт. В данный момент вызывается метод stop()
вашего класса Application
, поэтому вам не нужен эквивалент setDefaultCloseOperation()
Если вы хотите остановить приложение до этого, вы можете вызвать Platform.exit()
, например, в своем вызове onCloseRequest
.
Вы можете получить всю эту информацию на странице javadoc Application
: http://docs.oracle.com/javafx/2/api/javafx/application/Application.html
Ответ 2
Для справки, вот минимальная реализация с использованием 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...
}
Ответ 3
Некоторые из предоставленных ответов не работали для меня (javaw.exe все еще работает после закрытия окна), или eclipse показало исключение после закрытия приложения.
С другой стороны, это отлично работает:
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent t) {
Platform.exit();
System.exit(0);
}
});
Ответ 4
public void handle(WindowEvent event) {
Platform.exit();
System.exit(0);
}
Ответ 5
Вы попробовали это. setOnCloseRequest
setOnCloseRequest(EventHandler<WindowEvent> value)
Существует один пример
Ответ 6
Используя 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);
});
}
Ответ 7
Казалось, это сработало для меня:
EventHandler<ActionEvent> quitHandler = quitEvent -> {
System.exit(0);
};
// Set the handler on the Start/Resume button
quit.setOnAction(quitHandler);
Ответ 8
Try
System.exit(0);
это должно прервать основную строку потока и завершить основную программу
Ответ 9
Вы ДОЛЖНЫ переопределить метод stop() в своем экземпляре приложения, чтобы он работал. Если вы переопределили даже пустую "stop()", приложение прекратило изящество после закрытия последнего этапа (на самом деле последний этап должен быть основным этапом, чтобы он работал полностью, как предполагалось).
Никаких дополнительных вызовов Platform.exit или setOnCloseRequest не требуется в этом случае.