it-roy-ru.com

Приложение JavaFX все еще работает после закрытия

У меня проблема с закрытием моего приложения javaFX, когда я нажимаю кнопку закрытия со своей сцены, мое приложение исчезает, но если я ищу его в диспетчере задач, мое приложение остается там без закрытия . Я пытался использовать этот код ниже, чтобы заставить его закрыть основной поток и все дочерние потоки, но проблема сохраняется.

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

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

        });
16
Victor Laerte

Ваше приложение порождает какие-либо дочерние потоки? Если да, гарантировали ли вы, что завершаете их (предполагая, что они не являются потоками демонов)?

Если ваше приложение порождает потоки, не являющиеся демонами, они (и, следовательно, ваше приложение) будут продолжать работать до тех пор, пока вы не завершите процесс.

23
Sean Landsman

Единственным способом было вызвать System.exit (0);

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

[ИЗМЕНЕНО]

System.exit просто скрывает ваше приложение, если вы откроете задачу менеджера SO, ваше приложение будет там. Правильный способ состоит в том, чтобы проверить ваши потоки, одну за другой, и закрыть все перед закрытием приложения.

21
Victor Laerte

Первый взгляд здесь

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

В настоящее время у меня возникла эта проблема при использовании ThreadExecutor в контроллере . Приложение не закрывается, если ThreadExecutor не завершает работу . См. Здесь: how-to-shut-down-all-executors- когда выход из приложения

Так как это может быть проблемой для распознавания выхода приложения в контроллере, вы можете получить ссылку на контроллер из вашего класса 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, где вы можете вызвать метод Housekeeping контроллера (я использую метод 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);
}
5
jausen brett

Я смог решить эту проблему, вызвав com.Sun.javafx.application.tkExit(). Вы можете прочитать больше в моем другом ответе здесь: https://stackoverflow.com/a/22997736/1768232 (эти два вопроса действительно являются дубликатами).

5
durron597

Просто примечание: Попробуйте проверить, используете ли вы 

Platform.setImplicitExit(false);

Была похожая проблема и переполняла мои задачи. Приведенная выше строка не приблизит сцену, а скроет ее.

3
Isfirs

Чтобы имитировать нажатие «х» можно сделать:

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

Вы можете закрыть свое приложение, нажав кнопку «Закрыть» с некоторым кодом.

      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
manikant gautam