Класс Application и жизненный цикл приложения

Последнее обновление: 26.09.2021

Приложение JavaFX по сути представляет класс, который унаследован от класса javafx.application.Application. Объект этого класса проходит ряд этапов жизненного цикла. Все эти этапы представлены методами класса Application, которые вызываются автоматически средой JavaFX:

  • init(): инициализирует приложение до его запуска. Стоит отметить, что метод не должен использоваться для создания графического интерфейса или отдельных его частей.

  • start(Stage stage): здесь собственно и определяется графический интерфейс.

  • stop(): вызывается после закрытия приложения, например, после того, как пользователь нажал на крестик в правом верхнем углу

В итоге весь процесс работы приложения выглядит следующим образом:

  1. Запускает исполняемая среда JavaFX (если она не запущена)

  2. Она вызывает конструктор класса, который расширяет класс Application, тем самым создавая экземпляр данного класса

  3. Затем среда JavaFX вызывает метод init()

  4. Вызывается метод start(javafx.stage.Stage), в который среда JavaFX передает созданный объект Stage. Таким образом, приложение начинает работать

  5. Далее среда ожидает, пока либо в приложении не будет вызван программным способом метод Platform.exit(), либо пока не будет закрыто последнее окно программы

  6. После завершения работы приложения среда JavaFX вызывает метод stop()

Все эти методы мы можем переопределить в главном классе приложения. Но, как правило, определяется один метод start(), в котором определяются настройки графического интерфейса. Но, к примеру, переопределим все методы:

import javafx.application.Application;
import javafx.stage.Stage;
import java.util.List;

public class Main extends Application{
	
	public static void main(String[] args) {
        
		System.out.println("Launching Application");
		launch(args);
    }
	
	@Override
    public void init() throws Exception {
		
        System.out.println("Application inits");
        super.init();
	}
	@Override
    public void start(Stage stage) {
		
        System.out.println("Application starts");
		
		// получаем переданные параметры
		Application.Parameters params = getParameters();
		List<String> unnamedParams = getParameters().getUnnamed();
		int i =0;
		for(String param: unnamedParams){
			i++;
			System.out.printf("%d - %s \n", i, param);
		}
		
        stage.show();
	}
	@Override
    public void stop() throws Exception {
		
        System.out.println("Application stops");
		super.stop();
	}
}

В данном случае просто выводим на консоль индикацию о вызове метода.

Фактически работа любой программы на Java начинается с метода main, который является входной точкой в приложение. В этом методе вызывается метод launch(args). При запуске в метод launch мы можем передать аргументы в виде массива строк. Например, мы можем взять те значения, которые получает метод main через командную строку/терминал. Затем эти аргументы мы можем получить через getParameters, например, в методе start.

Затем среда создает объект класса Main, вызывает у него последовательно методы init и start. После вызова в методе start метода stage.show() нам отобразится окно приложения.

Закрытие окна приведет к вызову метода stop. И таким образом приложение завершит свое выполнение.

Пример запуска приложения:

Класс Application в JavaFX

Launcher thread и application thread

Стоит отметить, что ни метод init, ни конструктор класса, который наследуется от Application, не подходит и не должен использоваться для создания графического интерфейса. Почему? Потому что и метод init, и конструктор запускаются в потоке, который называется потоком запуска или launcher thread.

А создание, а также изменение графического интерфейса должно производиться в потоке приложения или application thread. Именно в таком потоке и запускается метод start (а также метод stop).

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850