关闭后 JavaFX 应用程序仍在运行

Posted

技术标签:

【中文标题】关闭后 JavaFX 应用程序仍在运行【英文标题】:JavaFX application still running after close 【发布时间】:2013-02-03 00:00:31 【问题描述】:

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

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() 

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

        );

【问题讨论】:

你碰巧在使用 MediaPlayer 控件吗? 我在使用媒体播放器时遇到了同样的问题。这是一个常见的问题吗? 我也有这个问题,我也在用MediaPlayer how to stop "JavaFX Application Thread" 的可能重复项 我的问题早于@durron597 【参考方案1】:

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

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

【讨论】:

我怀疑您创建的任何实时计时器(例如用于视频捕获)也会导致此问题。 即使分配给该线程的run() 方法完成,它们仍然存在?【参考方案2】:

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

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

[已编辑]

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

【讨论】:

这只会隐藏根本问题。另一个答案可能是正确的。 JavaFX 可以通过多种不同的方式启动。您可能并不总是知道在调用 Application.launch 之前和之后哪些线程处于活动状态。所以,问题是:如果想要完全杀死应用程序并调用 System.exit() 会有什么危害? 它实际上对我有用。 javaw.exe 项目的进程已关闭,Eclipse 禁用了 Stop 按钮,而是在没有这些调用的情况下关闭后保持活动状态【参考方案3】:

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

【讨论】:

我已经阅读了 this 咆哮的你的元答案,并认为你的辛勤工作不应该被忽视。所以,我正在尽我所能:+1 :-) 当前JDK中没有com.sun.javafx.application.tkExit()【参考方案4】:

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

Platform.setImplicitExit(false);

遇到了类似的问题,让我的任务超负荷。上面的行不会使舞台关闭,它会隐藏它。

【讨论】:

【参考方案5】:

我目前在控制器中使用 ThreadExecutor 时遇到了这个问题。 如果 ThreadExecutor 没有关闭,应用程序不会退出。 看这里: how-to-shut-down-all-executors-when-quitting-an-application

由于在控制器中识别应用程序出口可能会出现问题,因此您可以从 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);

【讨论】:

【参考方案6】:

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

stage.fireEvent(new WindowEvent(stage, WindowEvent.WINDOW_CLOSE_REQUEST))

【讨论】:

请提供更多详细信息。 请提供证明。文档对此的信息为零:docs.oracle.com/javase/8/javafx/api/javafx/stage/…【参考方案7】:

First Look Here

 public void start(Stage stage) 
        Platform.setImplicitExit(true);
        stage.setOnCloseRequest((ae) -> 
            Platform.exit();
            System.exit(0);
        );

【讨论】:

以上是关于关闭后 JavaFX 应用程序仍在运行的主要内容,如果未能解决你的问题,请参考以下文章

关闭后,我的 Windows 窗体应用程序仍在作为任务运行

关闭应用程序后,LocationUpdatesForegroundService 应用程序进程仍在运行

Application.Exit() - 关闭表单后应用程序仍在运行

窗口关闭后 PyQt 线程仍在运行

调用 Application.Exit() 后,应用程序仍在内存中运行

从 R Studio 运行时,R Shiny 应用程序会在一段时间后自行关闭,但它仍在收听......这是正常的吗?