20

我在关闭我的 javaFX 应用程序时遇到问题,当我从我的舞台上单击关闭按钮时,我的应用程序会消失,但是如果我在任务管理器中查找它,我的应用程序仍然存在而没有关闭。我尝试使用下面的代码强制它关闭主线程和所有子线程,但问题仍然存在。

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {

            @Override
            public void handle(WindowEvent t) {
                Platform.exit();
            }

        });
4

7 回答 7

26

您的应用程序是否产生任何子线程?如果是这样,您是否确保终止它们(假设它们不是守护线程)?

如果您的应用程序产生非守护线程,那么它们(以及您的应用程序)将继续存在,直到您终止该进程

于 2013-02-18T15:11:33.487 回答
26

唯一的方法是调用 System.exit(0);

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

[编辑]

System.exit 只会隐藏您的应用程序,如果您打开 SO 的管理器任务,您的应用程序将在那里。正确的方法是在关闭应用程序之前一一检查您的线程并关闭所有线程。

于 2013-02-18T18:13:01.260 回答
10

先看这里

 public void start(Stage stage) {
        Platform.setImplicitExit(true);
        stage.setOnCloseRequest((ae) -> {
            Platform.exit();
            System.exit(0);
        });
}
于 2017-04-06T12:49:48.410 回答
5

我能够通过调用来解决这个问题com.sun.javafx.application.tkExit()。您可以在此处阅读我的其他答案中的更多信息:https ://stackoverflow.com/a/22997736/1768232 (这两个问题确实是重复的)。

于 2014-04-10T19:54:26.597 回答
5

我目前在控制器中使用 ThreadExecutor 时遇到了这个问题。如果 ThreadExecutor 没有关闭,应用程序不会退出。请参阅此处: 如何关闭所有执行程序时退出应用程序

由于在控制器中识别应用程序出口可能会出现问题,因此您可以从 Application 类中获取对控制器的引用,如下所示(使用 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);
}
于 2015-11-08T22:28:08.660 回答
3

请注意:尝试检查您是否使用

Platform.setImplicitExit(false);

有一个类似的问题并且溢出了我的任务。上面的行不会使舞台关闭,它会隐藏它。

于 2015-09-22T12:51:40.847 回答
1

要模仿按“x”,可以这样做:

stage.fireEvent(new WindowEvent(stage, WindowEvent.WINDOW_CLOSE_REQUEST))
于 2016-02-12T07:38:47.603 回答