Все JаvаFХ-приложения создаются по одному и тому же образцу — типичному скелету. Поэтому, прежде чем перейти к рассмотрению каких-нибудь других средств JavaFX, стоит продемонстрировать скелет JаvаFХ-приложения. Помимо общей формы такого приложения, скелет демонстрирует порядок его запуска и вызова методов его жизненного цикла.
Когда вызывается каждый метод жизненного цикла, на консоль выводится извещающее об этом сообщение. Ниже приведен весь скелет JаvаFХ-приложения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
// Скелет JavaFX-приложения import javafx.application.*; import javafx.scene.*; import javafx.stage.*; import javafx.scene.layout.*; public class JavaFXSkel extends Application { public static void main(String[] args) { System.out.println("Запуск JavaFX-приложения."); // Запустить JavaFX-приложение, вызвав метод launch() launch(args); } // переопределить метод init() public void init() { System.out.println("В теле метода init()."); } // переопределить метод start() public void start(Stage myStage) { System.out.println("В теле метода start()."); // присвоить заголовок подмосткам myStage.setTitle("JavaFX Skeleton."); // Скелет JavaFX-приложения // Создать корневой узел. В данном случае используется // панель поточной компоновки, хотя возможны и другие // варианты компоновки FlowPane rootNode = new FlowPane(); // создать сцену Scene myScene = new Scene(rootNode, 300, 200); // установить сцену на подмостках myStage.setScene(myScene); // показать подмостки и сцену на них myStage.show(); } // переопределить метод stop() public void stop() { System.out.println("В теле метода stop()."); } } |
Несмотря на всю краткость такого скелета JаvаFХ-приложения, его можно скомпилировать и запустить на выполнение. В итоге на экране появляется окно.
Кроме того, при выполнении данного скелета JаvаFХ-приложения на консоль выводятся следующие сообщения:
1 2 3 4 |
Запуск JavaFX-приложения. В теле метода init(). В теле метода start(). В теле метода stop(). |
При закрытии окна данного скелета JаvаFХ-приложения на консоль выводится следующее сообщение:
1 |
В теле метода stop(). |
Разумеется, в реальном JаvаFХ-приложении методы его жизненного цикла обычно не направляют никаких сообщений в стандартный поток вывода System.out. Но в данном скелете это делается ради того, чтобы показать, когда именно вызывается каждый метод жизненного цикла JаvаFХ-приложения.
Более того, методы init() и stop() придется, как пояснялось ранее, переопределить только в том случае, если приложение должно выполнить специальные действия для запуска и закрытия. В противном случае можно воспользоваться реализациями этих методов, предоставляемыми по умолчанию в классе Application.
Рассмотрим данный скелет JаvаFХ-приложения более подробно. Сначала в нем импортируются четыре пакета. Первым из них является пакет javafx.application, содержащий класс Application. Вторым пакет javafx.scene, содержащий класс Scene. Третьим пакет javafx.stage, содержащий класс Stage. Четвертым — пакет javafx.scene.layout, предоставляющий ряд панелей компоновки. В данном случае используется панель поточной компоновки типа FlowPane.
Далее создается класс приложения JavaFXSkel, расширяющий класс Application. Как пояснялось ранее, от класса Application происходят классы всех JаvаFХ-приложений. Класс JavaFXSkel содержит два метода. Первый из них называется main() и служит для запуска приложения через метод launch().
Обратите внимание на то, что параметр args передается не только методу main(), но и методу launch(). И хотя это типичный подход, методу launch() можно передать и другие параметры или вообще не передавать их. И, как пояснялось ранее, метод launch() требуется только для автономных приложений.
Когда приложение начинает выполняться, первым из исполняющей системы JavaFX вызывается метод init(). Ради большей наглядности примера этот метод просто направляет сообщение в стандартный поток вывода System.out , но, как правило, он служит для инициализации некоторых свойств приложения.
Разумеется, если инициализация не требуется, то и переопределять метод init() не нужно, поскольку по умолчанию предоставляется его пустая реализация. Следует особо подчеркнуть, что с помощью метода init() нельзя создать подмостки или сцену. Эти элементы ГПИ следует создавать и отображать с помощью метода start().
По завершении метода init() начинает выполняться метод start(). Именно в нем и создается первоначальная сцена и устанавливаются главные подмостки.
Проанализируем этот метод построчно. Прежде всего следует заметить, что у метода start() имеется параметр типа Stage. Когда метод start() вызывается, этот параметр получает ссылку на главные подмостки приложения , где и устанавливается сцена для приложения.
После вывода на консоль сообщения о том, что метод start() начал выполняться, вызывается метод setTitle(), чтобы задать заголовок сцены, как показано ниже.
1 |
myStage.setTitle("JavaFX Skeleton."); |
Эта операция характерна для автономных приложений, хотя и не является обязательной. Указанный заголовок становится заглавием главного окна приложения.
Далее создается корневой узел сцены. Это единственный узел графа сцены,у которого отсутствует родитель. В данном случае в качестве корневого узла служит панель поточной компоновки типа FlowPane, как показано ниже. Хотя в корневом узле могут быть использованы и другие классы.
1 |
FlowPane rootNode = new FlowPane(); |
Как упоминалось ранее, класс FlowPane предоставляет диспетчер поточной компоновки, где элементы располагаются построчно с автоматическим переходомна новую строку, если требуется.
Следовательно, этот класс действует аналогично классу FlowLayout из библиотек AWT и Swing. В данном случае применяется поточная компоновка по горизонтали, хотя можно указать и поточную компоновку по вертикали.
Имеется возможность указать и другие свойства компоновки, в том числе промежутки между элементами по горизонтали и по вертикали, а также выравнивание, хотя в данном скелетном приложении этого не требуется.
В следующей строке кода корневой узел используется для построения сцены в виде объекта типа Scene:
1 |
Scene myScene = new Scene(rootNode, 300, 200); |
В классе Scene предоставляется несколько форм конструктора. В той форме конструктора, которая применяется здесь, создается сцена с указанным корневым умом и заданной шириной и высотой. Ниже приведена данная форма варианта конструктора класса Scene.
1 |
Scene(Parent корневой_узел, double ширина, double высота) |
Как видите, параметр корневой_узел относится к типу Parent. Это класс, производный от класса Node и инкапсулирующий узлы, у которых могут быть потомки. А параметры ширина и высота относятся к типу double. Это дает возможность передавать данному конструктору дробные числовые значения ширины и высоты сцены. В данном скелете JаvаFХ-приложения указан корневой узел rootNode и задана ширина 300 и высота 200 сцены.
В приведенной ниже строке кода устанавливается сцена myScene на подмостках myStage. Для этого вызывается метод setScene() определяемый в классе Stage и устанавливающий сцену, указываемую в качестве его аргумента.
1 |
myStage.setScene(myScene); |
В тех случаях, когда сцена больше не используется, обе предыдущие операции можно объединить в одну, как показано ниже. Благодаря своей компактности эта форма используется в большинстве представленных далее примеров.
1 |
myStage.setScene(new Scene(rootNode, 300, 200)) |
И в последней , приведенной ниже строке кода из метода start() отображаются подмостки и сцена. По существу, метод show() отображает окно, созданное на подмостках и сцене.
1 |
myStage.show() |
Когда приложение закрывается, его окно удаляется с экрана, а из исполняющей системы JаvаFХ вызывается метод stop(). В данном случае метод stop() просто выводит на консоль сообщение о том, что он начал выполняться.
Но, как правило,этот метод ничего не выводит на экран. Более того, если в приложении не требуется выполнять никаких закрывающих действий, то и переопределять метод stop() не нужно, поскольку по умолчанию предоставляется его пустая реализация.