В Swing вы можете просто использовать setDefaultCloseOperation() для завершения работы всего приложения при закрытии окна.
Однако в JavaFX я не могу найти эквивалента. У меня открыто несколько окон, и я хочу закрыть все приложение, если окно закрыто. Как это сделать в JavaFX?
Я понимаю, что могу переопределить setOnCloseRequest() , чтобы выполнить некоторую операцию при закрытии окна. Вопрос в том, какую операцию нужно выполнить, чтобы завершить работу всего приложения?
Метод stop() , определенный в классе Application , ничего не делает.
Kshitiz Sharma 28 Авг 2012 в 10:10
13 ответов
Лучший ответ
Приложение автоматически останавливается, когда закрывается последний Stage . В этот момент вызывается метод stop() вашего класса Application , поэтому вам не нужен эквивалент setDefaultCloseOperation()
Если вы хотите остановить приложение до этого, вы можете вызвать Platform.exit() , например, в своем вызове onCloseRequest .
SpaceCore186 3 Июл 2016 в 18:32
Create JavaFX Application using Eclipse IDE (2021) and Scene Builder
Для справки (как указано на связанной странице документации javadoc): приложение останавливается автоматически только в том случае, если для атрибута implicitExit на Platform установлено значение true .
Rahel Lüthy
13 Май 2015 в 13:00
Для справки, вот минимальная реализация с использованием Java 8:
Pierre Henry 8 Май 2015 в 12:50
Om Prakash 27 Июл 2020 в 16:16
Я просто хочу указать, что в этом случае метод stop () вообще не будет вызываться (по крайней мере, с JavaFX 8 в Windows), потому что System.exit () закрывает все слишком рано. В этом случае вы можете просто вызвать только System.exit (). Но если вы хотите что-то сделать в методе stop (), я бы порекомендовал вызвать здесь Platform.exit () и System.exit (0) в конце метода stop (), если это необходимо.
Источник: question-it.com
Как завершить программу javafx
Приложение JavaFX по сути представляет класс, который унаследован от класса javafx.application.Application . Объект этого класса проходит ряд этапов жизненного цикла. Все эти этапы представлены методами класса Application, которые вызываются автоматически средой JavaFX:
- init() : инициализирует приложение до его запуска. Стоит отметить, что метод не должен использоваться для создания графического интерфейса или отдельных его частей.
- start(Stage stage) : здесь собственно и определяется графический интерфейс.
- stop() : вызывается после закрытия приложения, например, после того, как пользователь нажал на крестик в правом верхнем углу
В итоге весь процесс работы приложения выглядит следующим образом:
- Запускает исполняемая среда JavaFX (если она не запущена)
- Она вызывает конструктор класса, который расширяет класс Application, тем самым создавая экземпляр данного класса
- Затем среда JavaFX вызывает метод init()
- Вызывается метод start(javafx.stage.Stage) , в который среда JavaFX передает созданный объект Stage. Таким образом, приложение начинает работать
- Далее среда ожидает, пока либо в приложении не будет вызван программным способом метод Platform.exit() , либо пока не будет закрыто последнее окно программы
- После завершения работы приложения среда JavaFX вызывает метод stop()
Все эти методы мы можем переопределить в главном классе приложения. Но, как правило, определяется один метод start() , в котором определяются настройки графического интерфейса. Но, к примеру, переопределим все методы:
JavaFX switch scenes
В данном случае просто выводим на консоль индикацию о вызове метода.
Фактически работа любой программы на Java начинается с метода main , который является входной точкой в приложение. В этом методе вызывается метод launch(args) . При запуске в метод launch мы можем передать аргументы в виде массива строк. Например, мы можем взять те значения, которые получает метод main через командную строку/терминал. Затем эти аргументы мы можем получить через getParameters, например, в методе start.
Затем среда создает объект класса Main, вызывает у него последовательно методы init и start. После вызова в методе start метода stage.show() нам отобразится окно приложения.
Закрытие окна приведет к вызову метода stop. И таким образом приложение завершит свое выполнение.
Пример запуска приложения:
Launcher thread и application thread
Стоит отметить, что ни метод init, ни конструктор класса, который наследуется от Application, не подходит и не должен использоваться для создания графического интерфейса. Почему? Потому что и метод init, и конструктор запускаются в потоке, который называется потоком запуска или launcher thread.
А создание, а также изменение графического интерфейса должно производиться в потоке приложения или application thread. Именно в таком потоке и запускается метод start (а также метод stop).
Источник: metanit.com
Как закрыть приложение JavaFX при закрытии окна?
В Swing вы можете просто использовать setDefaultCloseOperation() закрыть все приложение, когда окно закрыто.
Однако в JavaFX я не могу найти эквивалент. У меня открыто несколько окон, и я хочу закрыть все приложение, если окно закрыто. Как это сделать в JavaFX?
Я понимаю что могу переопределить setOnCloseRequest() выполнить некоторую операцию по закрытию окна. Вопрос в том, какую операцию нужно выполнить, чтобы прекратить работу всего приложения?
stop() метод, определенный в Application класс ничего не делает
user1345655 28 авг ’12 в 06:10 2012-08-28 06:10
2012-08-28 06:10
13 ответов
Приложение автоматически останавливается, когда последний Stage закрыто. На данный момент, stop() метод вашего Application класс называется, так что вам не нужен эквивалент setDefaultCloseOperation()
Если вы хотите остановить приложение до этого, вы можете позвонить Platform.exit() например в вашем onCloseRequest вызов.
user1344424 28 авг ’12 в 06:50 2012-08-28 06:50
2012-08-28 06:50
Некоторые из предоставленных ответов не сработали (javaw.exe все еще работает после закрытия окна) или eclipse показала исключение после закрытия приложения.
С другой стороны, это прекрасно работает:
user5095589 20 июл ’15 в 14:25 2015-07-20 14:25
2015-07-20 14:25
Для справки, вот минимальная реализация с использованием Java 8:
Источник: stackru.com