Приложение JavaFX по-прежнему работает после закрытия - программирование
Подтвердить что ты не робот

Приложение JavaFX по-прежнему работает после закрытия

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

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

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

        });

[EDITED]

С моими вопросами о javafx я заметил, что многие новые разработчики сталкиваются с проблемой управления Threads. Я хотел бы поделиться тем, что я сделал, чтобы упростить мою жизнь об управлении потоками на javafx. Я создал класс AsyncTask на основе AsyncTask с Android, который в основном делает то же самое для Android в скромном, но эффективном виде. Вы можете найти дополнительную информацию об этом на проект Github

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

[EDITED]

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

Ответ 3

Я смог решить эту проблему, вызвав com.sun.javafx.application.tkExit(). Вы можете прочитать больше в моем другом ответе здесь: fooobar.com/questions/328223/... (эти два вопроса действительно являются дубликатами).

Ответ 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

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

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

Ответ 7

Чтобы подражать нажатию "x", вы можете:

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

Ответ 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;