Как закрыть приложение 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);
}
}
используя 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);
для меня работает только следующее:
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();
}
});
вы должны переопределить метод "stop ()" в экземпляре приложения, чтобы он работал. Если вы переопределили даже пустой " stop ()", то приложение изящно завершает работу после закрытия последнего этапа (на самом деле последний этап должен быть основным этапом, чтобы он работал полностью, как и должно быть). Без каких-либо дополнительных платформ.в таком случае необходимы вызовы exit или setOnCloseRequest.