在Swing中,您可以在窗口关闭时使用setDefaultCloseOperation()
关闭整个应用程序。
但是在JavaFX中我找不到相应的东西。我打开了多个窗口,如果窗口关闭,我想关闭整个应用程序。在JavaFX中这样做的方法是什么?
编辑:
据我所知,我可以覆盖setOnCloseRequest()
以在窗口关闭时执行某些操作。问题是应该执行什么操作来终止整个应用程序?
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
stop();
}
});
在stop()
类中定义的Application
方法什么都不做。
当最后一个Stage
关闭时,应用程序会自动停止。此时,你的stop()
类的Application
方法被调用,所以你不需要等同于setDefaultCloseOperation()
如果您想在此之前停止应用程序,可以调用Platform.exit()
,例如在onCloseRequest
调用中。
您可以在Application
:http://docs.oracle.com/javafx/2/api/javafx/application/Application.html的javadoc页面上获得所有这些信息
getContentPane.remove(jfxPanel);
试试吧 (:
对我来说只有以下工作:
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();
}
});
您必须覆盖Application实例中的“stop()”方法才能使其正常工作。如果你已经覆盖了空的“stop()”,那么应用程序会在最后一个阶段关闭后正常关闭(实际上,最后一个阶段必须是使其完全按预期工作的主要阶段)。在这种情况下,不需要任何额外的Platform.exit或setOnCloseRequest调用。
一些提供的答案对我不起作用(关闭窗口后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);
});
}
我更喜欢在应用程序的开头调用Platform.setImplicitExit(true)
,而不是使用onCloseRequest处理程序或窗口事件。
根据JavaDocs:
“如果此属性为true,则JavaFX运行时将在最后一个窗口关闭时隐式关闭; JavaFX启动程序将调用Application.stop()方法并终止JavaFX应用程序线程。”
例:
@Override
void start(Stage primaryStage) {
Platform.setImplicitExit(true)
...
// create stage and scene
}
这似乎对我有用:
EventHandler<ActionEvent> quitHandler = quitEvent -> {
System.exit(0);
};
// Set the handler on the Start/Resume button
quit.setOnAction(quitHandler);
尝试
System.exit(0);
这应该终止主线程并结束主程序