我有问题,关闭我的JavaFX应用程序,当我从我的舞台点击关闭按钮,我的程序中消失,但如果我期待它在我的任务管理器我的申请仍然存在不密切。 我试着用下面这段代码,迫使它关闭主线程和所有儿童的主题,但问题仍然存在。
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent t) {
Platform.exit();
}
});
您的应用程序的任何派生子线程? 如果是这样你确保你终止它们(假定他们不是守护线程)?
如果您的应用程序产生的非守护线程然后他们(因此你的应用程序)将继续生活在,直到你杀的过程
唯一的办法是调用System.exit(0);
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent t) {
Platform.exit();
System.exit(0);
}
});
[EDITED]
System.exit只会隐藏你的应用程序中,如果你打开,这样的经理任务应用程序将在那里。 正确的方法是检查你的帖子,一招一式关闭应用程序之前,关闭所有。
首先看这里
public void start(Stage stage) {
Platform.setImplicitExit(true);
stage.setOnCloseRequest((ae) -> {
Platform.exit();
System.exit(0);
});
}
我可以通过调用来解决这个问题com.sun.javafx.application.tkExit()
你可以阅读我在其他答案在这里: https://stackoverflow.com/a/22997736/1768232 (这两个问题确实是重复的)。
同时使用控制器的ThreadExecutor我现在有这个问题。 如果ThreadExecutor不关闭应用程序不会退出。 请看这里: 如何到关机,所有执行者-当-戒烟-的应用
因为它可以识别控制器中的应用程序退出的问题,你可以从你的应用程序类到控制器的参考,像这样(使用Eclipse中的示例应用程序):
public class Main extends Application {
private SampleController controller;
@Override
public void start(Stage primaryStage) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("MyFXML.fxml"));
BorderPane root = (BorderPane)loader.load(getClass().getResource("Sample.fxml").openStream());
Scene scene = new Scene(root,400,400);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
controller = loader.<SampleController>getController();
}
catch(Exception e)
{
e.printStackTrace();
}
}
您的应用覆盖stop方法,在那里你可以调用控制器(我使用一个名为startHousekeeping方法)的看家方法:
/**
* This method is called when the application should stop,
* and provides a convenient place to prepare for application exit and destroy resources.
*/
@Override
public void stop() throws Exception
{
super.stop();
if(controller != null)
{
controller.startHousekeeping();
}
Platform.exit();
System.exit(0);
}
刚一说明:尝试,如果你使用的检查
Platform.setImplicitExit(false);
也有类似的问题,流淌在我的任务。 上面一行不会使平台紧密,它会隐藏它。
模仿按下“X”可以这样做:
stage.fireEvent(new WindowEvent(stage, WindowEvent.WINDOW_CLOSE_REQUEST))
您可以通过单击关闭按钮关闭应用程序,有一些代码。
stage.setOnCloseRequest(
event -> closeMyApp()
);
private void closeMyApp()
{
try
{
Stage stage = (Stage) closeButton.getScene().getWindow();
stage.close();
}
catch(Exception ee)
{
ex.printStackTrace();
}
}
// where closeButton is button having similar controller class initialization.
@FXML
private Button closeButton;