Приложение JavaFX по-прежнему работает после закрытия
У меня возникла проблема закрыть мое приложение javaFX, когда я нажимаю кнопку "закрыть" со своей сцены, мое приложение исчезает, но если я ищу его в своем диспетчере задач, мое приложение все еще там не закрывается.
Я попытался использовать этот код ниже, чтобы заставить его закрыть основной поток и все детские потоки, но проблема не устранена.
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent t) {
Platform.exit();
}
});
[EDITED]
С моими вопросами о javafx я заметил, что многие новые разработчики сталкиваются с проблемой управления Threads. Я хотел бы поделиться тем, что я сделал, чтобы упростить мою жизнь об управлении потоками на javafx. Я создал класс AsyncTask на основе AsyncTask с Android, который в основном делает то же самое для Android в скромном, но эффективном виде. Вы можете найти дополнительную информацию об этом на проект Github
Ответы
Ответ 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;