JavaFX

Библиотека для разработки графических приложений, встроена в Java начиная с Java 8.

Отдаленно похожа на Flash и Silverlight. Раньше в Java использовалась библиотека Swing, она и дальше будет поддерживаться, но не будет развиваться. В Интернете очень много примеров про Swing.

Интерфейс, создаваемый в JavaFX не нативен, а везде выглядит одинаково. JavaFX позволяет использовать в приложения стандартные элементы управления, например, кнопки, списки, прогресс бары, полосы прокрутки и т.п. Кроме этого, можно рисовать (даже как на Canvas из JavaFX), анимировать (элементы управления, рисунки). Можно стилизовать интерфейс с помощью CSS. Можно задавать интерфейсы с помощью языка FXML, т.е. примерно как на HTML. FXML мы использовать не будем, вместо этого будем задавать интерфейс программно, т.е. кодом на Java. Среды разработки типа IDEA, NetBeans позволяют рисовать интерфейс визуально - этим тоже не будем пользоваться.

Как устроено окно графического интерфейса

Node

Интерфейс состоит из Node (узлы). Есть один внешний Node, содержащий весь интерфейс. У узлов могут быть дети (children), подузлы. Например, Node “панель инструментов” может содержать подузлы “кнопка сохранения”, “кнопка открытия”, “подпанель”. Node “Подпанель” тоже может содержать подузлы в виде кнопок. Node “кнопка” не содержит подузлов, по крайней мере тех, которыми нам нужно пользоваться.

Parent extends Node

Это узлы, у которых есть подузлы. Например, панельки для кнопок, конечно имеют подузлы. А вот класс ImageView extends Node, не является Parent.

Group extends Parent, Region extends Parent

Group содержат подузлы и не имеют собственного размера. Размер группы автоматически вычисляется по размеру содержимого. Если двигать узлы внутри группы, то будет меняться и ее размер.

Region имеет размер (высоту, ширину), этот размер можно изменять. И Region можно стилизовать, указывая цвет фона и стиль рамки.

Control extends Region, Pane extends Region

Control - это элемент управления, например кнопка (Button), метка (Label). Pane - это панелька, на которой располагаются Node. При этом Pane позволяют изменять набор своих children. Pane позволяет управлять расположением children. Например, бывает HBox, VBox - это Pane, которые располагают детей, соотвественно, по горизонтали и по вертикали. Другой пример - BorderPane - в этой панели может быть пять детей. Слева, сверху, справа, снизу, посередине. Панелькой Pane тоже можно пользоваться, не обязательно именно HBox, VBox и т.п. Pane сама по себе никак не располагает компоненты, вам нужно будет вручную указывать координаты всех подузлов.

Preferred size

У всех Region хранится предпочитаемый размер. Это размер, который этот регион считает для себя оптимальным, чтобы показать все свое содержимое. Например, для кнопки Preferred size - это размер (высота, ширина), при котором в нее помещается весь текст на кнопке, и не остается свободного пространства.

Когда Pane располагает элементы внутри себя, она часто использует предпочитаемые размеры для подузлов.

Ограничения (constraints)

С каждым узлом связан набор constraint. Мы сами задаем эти constraints, чтобы указать внешнему контейнеру (панельке Pane, которая содержит этот узел), как его располагать. Разные виды Pane понимают разные constraint. Например, BorderPane в качестве constraint просит указывать положение: сверху, снизу, слева, справа, посередине. VBox интересуется, где элемент хочет находиться: слева, справа, в середине, растянуться. (Можно VBox глобально настроить, чтобы, например, все подузлы были по центру, но можно отдельным узлам дать отдельные constraint).