JavaFX application still running after close

后端 未结 8 1154
长发绾君心
长发绾君心 2021-01-04 00:25

I\'m having problem to close my javaFX application, when I click the close button from my stage, my application disappears but if I look for it in my task manager my applica

相关标签:
8条回答
  • 2021-01-04 00:57

    First Look Here

     public void start(Stage stage) {
            Platform.setImplicitExit(true);
            stage.setOnCloseRequest((ae) -> {
                Platform.exit();
                System.exit(0);
            });
    }
    
    0 讨论(0)
  • 2021-01-04 01:10

    The only way was to call System.exit(0);

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

    [EDITED]

    System.exit will just hide your application, if you open SO's manager task your application will be there. The correct way is to check your Threads, one by one and close all before close application.

    0 讨论(0)
  • 2021-01-04 01:14

    You could close your application by clicking close Button , with some code.

          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;
    
    0 讨论(0)
  • 2021-01-04 01:16

    I currently had this problem while using an ThreadExecutor in the controller. Application does not exit if the ThreadExecutor is not shutdown. See here: how-to-shut-down-all-executors-when-quitting-an-application

    As it can be a problem to recognize an application exit in the controller, you can get a reference to the controller from your Application class like so (using the sample application from 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();
        }
    }
    

    Your Application overrides the stop method, where you can call a housekeeping method of the controller (i use a method called 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);
    }
    
    0 讨论(0)
  • 2021-01-04 01:17

    Does your application spawn any child threads? If so have you ensured that you terminate them (assuming that they're not daemon threads)?

    If your application spawns non-daemon threads then they (and therefore your app) will continue to live on until such time you kill the process

    0 讨论(0)
  • 2021-01-04 01:18

    Just a note: Try checking if you use

    Platform.setImplicitExit(false);
    

    Had a similar problem and overflowing my tasks. The above line will not make the stage close, it will hide it.

    0 讨论(0)
提交回复
热议问题