JavaFX应用程序仍接近后运行(JavaFX application still running

2019-07-20 02:21发布

我有问题,关闭我的JavaFX应用程序,当我从我的舞台点击关闭按钮,我的程序中消失,但如果我期待它在我的任务管理器我的申请仍然存在不密切。 我试着用下面这段代码,迫使它关闭主线程和所有儿童的主题,但问题仍然存在。

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

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

        });

Answer 1:

您的应用程序的任何派生子线程? 如果是这样你确保你终止它们(假定他们不是守护线程)?

如果您的应用程序产生的非守护线程然后他们(因此你的应用程序)将继续生活在,直到你杀的过程



Answer 2:

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

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

[EDITED]

System.exit只会隐藏你的应用程序中,如果你打开,这样的经理任务应用程序将在那里。 正确的方法是检查你的帖子,一招一式关闭应用程序之前,关闭所有。



Answer 3:

首先看这里

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


Answer 4:

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



Answer 5:

同时使用控制器的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);
}


Answer 6:

刚一说明:尝试,如果你使用的检查

Platform.setImplicitExit(false);

也有类似的问题,流淌在我的任务。 上面一行不会使平台紧密,它会隐藏它。



Answer 7:

模仿按下“X”可以这样做:

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


Answer 8:

您可以通过单击关闭按钮关闭应用程序,有一些代码。

      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;


文章来源: JavaFX application still running after close