JavaFX

JavaFX
Основные данные

разработчик Oracle
Текущая  версия 14
( 10 марта 2020 г. )
Операционная система Windows , macOS , Linux
язык программирования Ява
категория Фреймворк
Лицензия GPL с исключением связывания GPL
OpenJFX на java.net и openjfx.io

JavaFX является основой для создания кросс-платформенных Java - приложений . Это спецификация Java от Oracle, цель которой - облегчить профессиональное создание и распространение интерактивного , мультимедийного контента и графических пользовательских интерфейсов (GUI) на всех платформах Java .

До 2014 года AWT и Swing были стандартными решениями для графических приложений под Java. Однако это продолжалось годами. Были пробелы в области медиа и анимации , которая сейчас востребована современными графическими интерфейсами. Вместо того чтобы вкладывать средства в дальнейшее развитие AWT / Swing, Oracle решила полностью переработать уровень графического интерфейса пользователя с помощью JavaFX.

JavaFX относится к графу сцены (англ. Scene graph ), который управляет отдельными компонентами графического интерфейса. С FXML он также обеспечивает декларативное описание графических интерфейсов на основе XML . Scene Builder представляет собой графический инструмент , который упрощает создание FXML файлов. Кроме того, для дизайна можно использовать веб- технологии, такие как CSS, путем встраивания их в код FXML.

Поскольку JavaFX предлагает все API для современных интерфейсов и не зависит от AWT / Swing, он формирует полный медиа-стек. JavaFX имеет прямой доступ ко всем навыкам работы с 2D / 3D современными графическими процессорами . Таким образом, все может быть запрограммировано с помощью JavaFX, что ранее предпочтительно было реализовано с помощью Flash .

Среда выполнения JavaFX была частью каждой установки Java SE x86, начиная с версии Java SE Runtime 7, обновление 6–10 .

История развития

История JavaFX не очень проста. Первоначально Sun / Oracle хотела позиции JavaFX в качестве флэш - замены в Интернете, но комбинация HTML5 и CSS3 и JavaScript был слишком привлекательным. В настоящее время это в основном набор инструментов с графическим интерфейсом для классических клиентских приложений .

Версия 1

JavaFX был анонсирован в мае 2007 года и представлен на конференции разработчиков JavaOne в мае следующего года . 4 декабря 2008 г. Sun официально выпустила JavaFX 1.0 в качестве комплекта разработчика для Windows и macOS . Релиз JavaFX 1.0 появился вместе с языком программирования JavaFX Script . Этот язык упростил построение иерархических графов объектов и предложил хороший синтаксис для привязки объектов, с которым можно было синхронизировать состояния.

Версия 1.2 была выпущена в июне 2009 года. Он содержал, среди прочего, настраиваемые элементы управления пользовательского интерфейса, дополнительные классы макета (Tile, Stack, Flow, ClipView, Panel), поддержку каналов RSS / Atom. Это не имеет обратной совместимости. Linux и Solaris поддерживаются только с этой версии . Версия 1.3 (кодовое название SoMa) была выпущена 22 апреля 2010 года. Наиболее очевидное нововведение - иногда огромное увеличение производительности. Также новинкой является JavaFX TV, официальный CSS API для разработки элементов управления JavaFX, некоторые новые желаемые элементы управления и поддержка 3D. Версия 1.3.1 была выпущена 21 августа 2010 г. и улучшила индикатор выполнения при запуске и отладке в Netbeans 6.9.1.

Версия 2

JavaFX 2.0 появился, как было объявлено в третьем квартале 2011 года. Эта версия не использует JavaFX Script, «потому что Oracle не хотела создавать другой язык программирования, а чистый Java API, к которому разработчики могли бы обращаться из различных существующих языков сценариев». JavaFX API-интерфейсы скриптов, перенесенные на Java. Аппаратный рендеринг также был оптимизирован в JavaFX 2.0, так что теперь стали возможны игры и сложные трехмерные представления. JavaFX 2.0 отображает содержимое HTML и JavaScript с помощью библиотеки WebKit . Когда была выпущена новая версия, Oracle объявила, что продолжит разработку JavaFX как проекта с открытым исходным кодом как часть OpenJDK .

JavaFX все больше и больше разрабатывался для альтернативы Swing / AWT. JavaFX 2.2 был выпущен в августе 2012 года. Это было интегрировано в JRE / JDK 7 Update 6. Этот шаг был необычным, потому что такие большие дополнения никогда не делались как обновления в JRE / JDK.

Развитие открытого исходного кода привело к появлению OpenJFX, который вместе с OpenJDK позволяет создавать полностью бесплатную систему Java со стеком графического интерфейса пользователя под GPL .

Версия 8

С переходом к выпуску Java 8, JavaFX совершил скачок выпуска с 2 до 8. JavaFX 8 привнес в него некоторые новшества. Например, он предлагает лямбды в качестве новой языковой конструкции. Одним из больших нововведений является также JavaFX-UI-Toolkit, который поставляется с Java 8 в качестве рекомендуемого UI-Toolkit. Среди прочего, инструментарий FXML предлагает. XML -На языка для создания пользовательских интерфейсов.

В версии 8u33 поддержка Oracle ARM для JavaFX была прекращена. Поэтому JavaFX больше не входит в официальные дистрибутивы Java для ARM.

Дорожная карта

«Сначала мобильные» и «прежде всего Интернет» побуждают Oracle прекратить поддержку JavaFX, вероятно, в марте 2025 года. Дальнейшая разработка будет происходить в виде отдельного модуля с открытым исходным кодом, над которым Oracle уже работает с заинтересованными сторонами.

архитектура

Архитектура JavaFX совершенно новая и, в частности, не основана на Swing или AWT. Однако это также означает, что нельзя просто смешивать JavaFX и AWT / Swing (даже если для этого есть решения). JavaFX предлагает полный API для современных интерфейсов. Основные пакеты этого API:

Упаковка описание
javafx.animation Классы для анимации на основе переходов
javafx.application Классы для основного жизненного цикла приложения
javafx.collections Основные коллекции JavaFX, включая утилиты
javafx.event Базовая структура для событий JavaFX и их обработка
javafx.fxml Классы для загрузки иерархии объектов из структуры разметки, такой как FXML
javafx.geometry Классы для геометрических операций над двумерными объектами
javafx.scene Базовые классы для JavaFX Scene Graph API и родительский пакет отдельных компонентов и элементов. Он содержит подпакеты, такие как холст, диаграмма, элемент управления, эффект, изображение, ввод, макет, мультимедиа, краска, форма, текст, преобразование, Интернет и т. Д.
javafx.stage Контейнерные классы верхнего уровня для содержимого JavaFX
javafx.util Различные утилиты и вспомогательные классы

На следующем рисунке показана архитектура JavaFX, официально представленная Oracle:

Javafx-architecture.svg

Как и любое приложение Java, JavaFX также имеет виртуальную машину Java (JVM) на самом нижнем уровне , которая отвечает за выполнение байт-кода Java . Обычно каждая запущенная программа Java выполняется на своей собственной виртуальной машине (ВМ).

Соответствующие инструменты разработки для Java или JavaFX предоставляются в Java SE Development Kit (или просто Java Development Kit, JDK для краткости). Исходя из этого, существует множество расширений, некоторые из которых используются с Java в течение очень долгого времени, например, Java 2D для рисования двухмерных фигур.

Prism - это новый движок рендеринга , использующий графическое оборудование (если оно поддерживается). Помимо прочего, он также делает свойства Java 2D и различные графические эффекты, такие как тени, отражения, преобразования или анимации, доступными на высоком уровне. Он отображается с помощью OpenGL под Linux и macOS , а Direct3D используется под Windows . Если графическое оборудование не поддерживается, используется программный откат к Java 2D.

Набор инструментов Glass Windowing Toolkit предоставляет низкоуровневые процедуры операционной системы , такие как управление окнами, таймеры или управление событиями. Он служит платформо-зависимым уровнем, который связывает платформу JavaFX с операционной системой.

Медиа двигатель основан на GStreamer и предлагает расширенную поддержку аудио и видео. Веб - движок позволяет вложение контента веб в приложениях JavaFX. Это включает рендеринг HTML на основе движка WebKit , аппаратно-зависимый рендеринг через Prism, а также возможность доступа к DOM и манипуляции с ним.

Quantum Toolkit ссылки Prism, Glass Windowing Toolkit, Media Engine и Web Engine и делает их равномерно доступными для JavaFX API. API JavaFX и Quantum Toolkit инкапсулируют детали нижних уровней и скрывают их от пользователя. В принципе, разработчику JavaFX не нужно знать, как работают нижние уровни.

Структура приложения JavaFX

Жизненный цикл JavaFX

Image
Жизненный цикл приложения JavaFX

Приложения JavaFX расширяют базовый класс Application , методы жизненного цикла, такие как init(), start()или stop() унаследованные . Эти методы могут (или должны) быть переопределены в приложении JavaFX . Средство запуска JavaFX заботится о том, чтобы они вызывались соответствующим образом. Таким образом, приложения JavaFX не требуют mainметода: собственный статический main(String[])метод направляет статический launch(String[])метод классаApplication - и передает ему все параметры вызова . Поскольку метод класса знает, в каком классе он был вызван, он создает экземпляр этого класса, а затем вызывает методы жизненного цикла.launch(...)

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

  1. При запуске приложения, то JavaFX во время выполнения первых конструирует экземпляр в Applicationклассе.
  2. Теперь init()выполняется метод созданного экземпляра. Этот метод по умолчанию реализован как пустой, и его необязательно перезаписывать. Например, здесь можно прочитать параметры звонка. Однако здесь еще нельзя создавать элементы пользовательского интерфейса.
  3. Затем вызывается метод start(javafx.stage.Stage), который должен быть переопределен любым приложением JavaFX. JavaFX передает этап методу, который примерно соответствует задаче основного контейнера и может лучше всего сравниваться с стартовым окном.
  4. Среда выполнения JavaFX теперь ожидает завершения работы приложения. Это можно сделать следующим образом:
    • вызывая метод Platform.exit()
    • закрыв последнее окно и установив для атрибута implicitExitзначение Platform on true.
  5. Теперь среда выполнения вызывает stop()метод до остановки процесса Java . Опять же, этот метод не обязательно перезаписывать.

Сцена

Image
Сцена формирует основу для актуального содержания. Класс Scene управляет графом сцены. Это корневое дерево, состоящее из узлов. Родительские узлы содержат дополнительные узлы, а конечные узлы представляют собой видимые элементы графического интерфейса (кнопка, текстовое поле, ползунок и т. Д.).

start(...)Метод является Stageпередача. Параметр из start(...)поэтому типа javafx.stage.Stage. Этот класс является контейнером JavaFX верхнего уровня, который всегда создается платформой в качестве параметра start(...)метода. Лучше всего это сравнить со стартовым окном . В приложении также могут быть созданы дополнительные объекты сцены .

Сцену можно использовать для создания нескольких сцен или (англ. Scenes ) для презентации. Имена базовых классов Stageи Sceneпохож на театр: Этап этап , который указан на сцене. Он формирует основу для актуального содержания.

Как и в случае с окном, существует множество вариантов настройки объекта сцены с использованием соответствующих методов, например

  • setWidth(double value)и укажите setHeight(double value)высоту и ширину сцены, и
  • setTitle(java.lang.String value) устанавливает заголовок окна.

StageStyleОпределяет внешний вид окна. Значение по умолчанию - это DECORATEDто, что отображает окно с рамкой и элементами управления в зависимости от операционной системы и на белом фоне. Однако большинство свойств объекта Stage доступны только для чтения, поскольку они изменяются базовой платформой.

Сцена

Одна или несколько сцен такого типа обычно представляются на сцене javafx.scene.Scene. Этот класс является контейнером для всего контента в графе сцены, который управляет отдельными компонентами графического интерфейса .

Из теории графов точки зрения графа сцены является корневым деревом , состоящее из узлов (немецкий узел существует). В качестве внутренних узлов существуют родительские узлы, которые могут содержать дополнительные узлы (узлы) в качестве дочерних. Лист (Engl. , Листовой узел ), однако, не имеет дальнейших детей. Теперь листья представляют собой видимые элементы графического интерфейса (например, кнопки, текстовые окна и ползунки), родительские узлы - невидимые структурные элементы (например, BorderPane, HBox и VBox). Приложение должно иметь корневой узел (англ. Root node ) для определения графа сцены. Это что-то вроде истока, из которого развивается вся сцена. Существует аргумент для конструктора с Sceneобъектом для этого. Эти Sceneобъекты должны быть созданы и изменены в прикладном JavaFX потоке .

Это Sceneтакже связь между окном, предоставляемым операционной системой, и графом сцены. Если, например, окно увеличивается, он пытается Sceneпередать это изменение корневому узлу: isResizableдля этого он вызывает метод корневого узла, чтобы узнать, хочет ли узел реагировать на изменения размера. Если узел trueвернется, он изменит Sceneего на новый размер, он falseоставит его равным.

С помощью команды stage.setScene(scene)граф сцены выходит Sceneна сцену через класс . Все графические объекты приложения JavaFX присутствуют в любой момент времени, т.е. ЧАС. они не существуют просто во время рисования.

Узлы

Image
Иерархия классов узлов в JavaFX.

Все объекты в графе сцены относятся к типу Node. Таким образом, они формируют содержимое графа сцены. Каждый узел и каждый элемент в графе сцены, в свою очередь, является подтипом абстрактного класса Node.

Подкласс Nodeis Parent. Родительские узлы являются базовым классом для всех узлов, которые содержат дополнительные узлы в качестве дочерних, т.е. являются контейнерами. Есть подклассы Parent:

  • Класс Groupобъединяет несколько элементов в один узел. Он позволяет, например, применять к группе преобразования и эффекты и делегировать их всем элементам (дочерним элементам) группы. GroupУзел работает один ObservableListиз детей. Этот метод getChildren()можно использовать для вызова списка дочерних элементов, который затем можно добавить с помощью getChildren().add(element)дополнительных элементов. Один Groupне заботится о детских позиций и не может быть отрегулирована с помощью CSS.
  • Класс Regionформирует базовый класс для всех элементов управления и макетов и расширяет базовый класс множеством опций для стилизации с помощью CSS. Оттуда Regionидет более низкий класс Pane, который является потомками через общедоступные методы извне. BorderPaneНапример, производный класс расположен над дочерними элементами ( вверху ), слева ( слева ), справа ( справа ), снизу ( внизу ) и по центру (в центре ).
  • Класс Controlрасширяет класс Region. Это базовый класс для компонентов, которые позволяют вводить данные пользователем в той или иной форме. Это включает, например, кнопки или метки. Каждый элемент управления, в свою очередь, можно редактировать оптически с помощью CSS.

JavaFX, как и Swing, поставляется с набором стандартных компонентов в пакете javafx.scene.controlи имеет Controlбазовый класс. В следующем обзоре перечислены наиболее важные элементы управления, доступные в JavaFX:

Контроль использовать
Этикетка Метка является одним из самых простых элементов управления. Он состоит из текста и любого другого узла для объявления. Для этого часто используется изображение.
Гиперссылка Соответствует HTML - гиперссылка и по умолчанию отображаются как синий подчеркнутый текст.
Кнопка Можно нажать кнопку. Статус выбора сохраняется.
Переключатель Кнопка выбора для индивидуального выбора из группы переключателей . Статус выбора сохраняется до тех пор, пока не будет выбрана другая кнопка в той же группе.
Кнопка-переключатель Радиокнопка, которая существует в двух состояниях: выбрано и не выбрано. Работает как CheckBox или RadioButton.
CheckBox Флажок это окно выбора с тремя возможными состояниями: не определено, проверяемых и непроверяемых. Статус выбора сохраняется до его изменения.
ChoiceBox Список выбора для выбора отдельного элемента из предпочтительно короткого списка.
Текстовое поле Однострочное поле ввода свободного текста с управлением курсором и выбором.
TextArea Многострочное поле ввода свободного текста с управлением курсором и выбором.
Посмотреть список Стандартный компонент для отображения списков объектов.
TableView Компонент таблицы, состоящий из ряда столбцов (TableColumns). Отдельные ячейки представлены как TableCell.
TitledPane Частичный диалог, который можно открывать и закрывать.
ScrollPane Служит для перемещения и представления раздела с горизонтальной и вертикальной полосой прокрутки ( полосой прокрутки ).

Изначально элементы управления - это просто узлы, которые можно добавить в SceneGraph и затем отобразить. Конечно, соответствующие классы для элементов управления пользовательского интерфейса предоставляют различные специфические свойства и методы для поддержки типичного взаимодействия с пользователями.

Примеры программ

Привет, мир JavaFX!

Image
Скриншот программы Hello World с JavaFX.

В следующем примере программы показана типичная программа Hello World на JavaFX:

package application;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {

	@Override
	public void start(Stage primaryStage) {
		Label label = new Label("Hello JavaFX World!");

		StackPane root = new StackPane();
		root.getChildren().add(label);

		Scene scene = new Scene(root, 400, 300);

		primaryStage.setTitle("Hello JavaFX World!");
		primaryStage.setScene(scene);
		primaryStage.show();
	}

	public static void main(String[] args) {
		launch(args);
	}
	
}

Класс Mainявляется Applicationпроизводным от класса . Собственный main(...)метод пересылается в launch(...)метод класса Application. В созданном экземпляре Applicationкласса сначала init()выполняется метод, который по умолчанию остается пустым.

Затем выполняется start(...)метод, который, как и здесь, должен быть переопределен каждым приложением JavaFX. JavaFX передает метод, Stageкоторый можно сравнить с стартовым окном. start()Теперь в методе выполняются следующие шаги:

  • Создается простой элемент управления меткой label. Отображаемый текст «Hello JavaFX World!» Здесь передается непосредственно в конструктор.
  • Теперь StackPaneимя rootсоздано. Это помещает все дочерние элементы друг на друга в порядке их добавления. По умолчанию компоненты центрируются в StackPane. Созданный root.getChildren().add(label)ранее теперь Label labelдобавляется через .
  • Теперь Scene sceneсоздается один файл, который затем можно Stageзагрузить в файл . Приложение должно указать корневой узел для графа сцены. В этом примере это rootобъект типа StackPane. Кроме того, конструктору предоставляется определенный размер отображения ( ).
  • На следующем этапе primaryStage.setTitle("Hello JavaFX World!")заголовок окна приложения также устанавливается на «Hello JavaFX World!». Однако наиболее важным является назначение сцены, sceneкоторая относится к фактическому содержанию. Теперь show()метод пытается отобразить окно, задав для видимости значение true.

Цикл Жизни

package application;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.stage.Stage;

public class CycleOfLife extends Application {

	@Override
	public void init() {
		System.out.printf("Die Methode init(), aufgerufen im Thread %s%n",
				Thread.currentThread());
	}

	@Override
	public void start(Stage primaryStage) {
	   System.out.printf("Die Methode start(), aufgerufen im Thread %s%n",
                  Thread.currentThread());
	   Platform.exit();
	}

	@Override
	public void stop() {
		System.out.printf("Die Methode stop(), aufgerufen im Thread %s%n",
				Thread.currentThread());
	}

	public static void main(String[] args) {
		System.out.printf("Die Methode main(), aufgerufen im Thread %s%n",
				Thread.currentThread());
		launch(args);
	}
	
}

Программа выдает примерно следующий результат:

Метод main (), вызываемый в потоке thread [main, 5, main]
Метод init (), вызываемый в потоке [JavaFX-Launcher, 5, main]
Метод start (), вызываемый в потоке [JavaFX Application Thread, 5, main]
Метод stop (), вызываемый в потоке [JavaFX Application Thread, 5, main]

main(...)Метод CycleOfLifeвызовов Application.launch(...)и экземпляр Applicationподкласса создаются в приложениях JavaFX нити . init()Метод вызывается в потоке JavaFX Launcher , который является поток , который запускает приложение. Для того, чтобы выполнить команду start()и stop()методы, JavaFX создает поток , называемый JavaFX Application Thread . Создание Stageи Sceneобъектов и изменения в графе сцены должны иметь место в этом потоке приложения JavaFX .

Обработка событий

Обработка событий JavaFX - это последующее дальнейшее развитие обработки событий в рамках AWT и Swing или самой Java, но также и в Интернете. Современные графические программы очень ориентированы на события. Следовательно, вам нужны механизмы, которые реагируют на возникновение событий.

Ральф Штайер объясняет основную идею обработки событий следующим образом:

Один объект может запускать объект события, а другой объект регистрируется для реакции на него (так называемый прослушиватель событий), например, в случае искры, когда передатчик отправляет сообщение со своим радио на определенной частоте и приемник отправляет свое радио, настроенное на эту частоту, получает сообщение. Точно так же получатель может реагировать на сообщение о событии или игнорировать сообщение. Таким образом, конкретная обработка события определяется в объекте слушателя.

События JavaFX

Пакет javafx.eventсодержит соответствующие классы и интерфейсы для обработки событий в JavaFX. В принципе, событие бетона экземпляр класса javafx.event.Eventили один из его подклассов , такие как DragEvent, KeyEvent, MouseEventили ScrollEvent.

Когда происходит событие, используется внутренний механизм для определения того, какой узел является целью объекта события. Например, для событий мыши целью является узел в месте нахождения указателя мыши. От выбранной цели события существует цепочка отправки событий, которая идет вверх до корня графа сцены.

Сначала всегда делается попытка обработать событие в самом внутреннем элементе, в котором оно произошло. Для этого требуется подходящий обработчик событий (или какая-то другая структура обработки). После этого элемент объекта события пересылается следующему наивысшему объекту в дереве и т. Д. В этом контексте всплытия событий говорят, что объект события, такой как пузырь (англ. Bubble ), поднимается к корню графа сцены. Если это нельзя обработать до корня, он будет уничтожен. Это вполне нормальное явление, поскольку многие события, такие как перемещение указателя мыши на несколько миллиметров, не вызывают определенной реакции со стороны приложения.

Обработчик события

Если какой-либо узел в маршруте объекта события зарегистрировал обработчик события, событие потребляется. Таким образом, задача программиста состоит в том, чтобы соответствующим образом отловить событие и реализовать реакцию на него. Обработчики событий в основном реализуют EventHandlerинтерфейс, который handle()заставляет перезаписывать описанный там метод. Вот где собственно реакция на произошедшее событие. Затем этот метод содержит в качестве параметра объект события соответствующего типа.

Следующие два метода предлагают общий способ добавления или отмены регистрации обработчика событий к объекту узла:

  • addEventHandler(EventType<T>, EventHandler<? super T>) добавить обработчик
  • removeEventHandler(EventType<T>, EventHandler<? super T>) чтобы выйти из обработчика.

Первый параметр указывает конкретное событие, на которое вы хотите отреагировать, а второй параметр определяет сам обработчик событий.

Часто обработчик событий создается и регистрируется как анонимный класс , а handle()метод реализуется напрямую для обеспечения желаемых действий. Во-первых, это Button btnмогло бы выглядеть примерно так:

btn.addEventHandler(ActionEvent.ACTION, new EventHandler<ActionEvent>() {
	@Override
	public void handle(ActionEvent event) {
		// do something here
	}
});

В качестве лямбда-выражения это может выглядеть примерно так:

btn.addEventHandler(ActionEvent.ACTION, (event) -> {
    // do something here
});

Кроме того, классы компонентов также предлагают свои собственные методы установки для определенных событий, которые имеют следующий формат:

setOnEventType(EventHandler handler)

Это указывает EventTypeна тип события. Например, есть Buttonтакой способ setOnAction(EventHandler<ActionEvent>):

btn.setOnAction(new EventHandler<ActionEvent>() {
    @Override
	public void handle(ActionEvent event) {
		// do something here
	}
});

Динамические структуры данных с уведомлениями об изменениях

В JavaFX отдельных значения не только observierbar , но и динамические структуры данных , которые находятся в пакете javafx.collectionsявляются: ObservableList, ObservableMapи ObservableSetявляются производными от каждого наблюдаемого интерфейса , и добавить каждый метод добавляет к соответствующему ChangeListenerрегистра. Таким образом, новые структуры данных расширяют java.utilструктуры данных List, Setи Mapи могут сообщать об изменениях.

К ObservableListпримеру, есть интерфейс для одного , ListChangeListenerкоторый реагирует на изменения в наблюдаемом списке. Класс ListChangeListener.Changeпредставляет собой изменение, внесенное в такой список. С участием

observableList.addListener(new ListChangeListener(){/* do something here */});

затем слушатель регистрируется для внесения изменений в список.

Свойства и привязка данных

Свойства и привязка данных - это два мощных языковых механизма в JavaFX, которые можно использовать для создания отношений между переменными. Обычно они используются для (взаимного) обновления значений. Например, пользователь управляет ползунком, который управляет шириной прямоугольника, и в зависимости от установленного widthзначения необходимо обновить значение модели данных и пересчитать площадь прямоугольника. Поэтому для сравнения данных друг с другом существует концепция свойств и привязки данных.

В JavaFX свойства являются основными строительными блоками для обработки и передачи изменений значений. Они составляют основу удобной привязки данных. Свойство - это контейнер данных, который также позволяет получать уведомления об изменениях. Другие классы, заинтересованные в изменениях, могут зарегистрироваться как слушатели. Связь также называется зависимостью или зависимостью .

API привязки разделены на две категории в JavaFX:

  • API высокого уровня: предоставляет простой способ создания привязок для большинства ситуаций. В частности, для этого предусмотрено автозавершение кода в таких средах IDE, как NetBeans.
  • Низкоуровневый API: этот API очень гибкий, экономичный и быстрый и предлагает расширенные возможности, если высокоуровневого API недостаточно.

В пакете javafx.beans.propertyразличных классов свойств определены, например, для капсулирования int, long, float, double, booleanи String. Свойства реализуют интерфейс Observableили для уведомления об изменениях ObservableValue<T>. Например, вместо примитивного типа данных double используется новый тип, DoublePropertyкоторый double«обертывает» примитивный тип . В дополнение к методам получения и установки свойства JavaFX также имеют дополнительный метод, который заканчивается свойством и возвращает объект свойства.

Следующий пример взят из документации Java от Oracle и определяет класс с именем Bill(German invoice ), который реализует единственное свойство с именем amountDue(German due amount ):

package application;

import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;

public class Bill {

	// Definiere eine Variable um die Property zu speichern
    private DoubleProperty amountDue = new SimpleDoubleProperty();

    // Definiere die Getter-Methode für den Wert der Property
    public final double getAmountDue() {
    	return amountDue.get();
    }

    // Definiere die Setter-Methode für den Wert der Property
    public final void setAmountDue(double value) {
    	amountDue.set(value);
    }

    // Definiere einen Getter für die Property selbst
    public DoubleProperty amountDueProperty() {
    	return amountDue;
    }

}

amountDueОбъект является экземпляром класса javafx.beans.property.DoubleProperty. Чтобы инкапсулировать его, он privateпомечен как. В соответствии с соглашением об именах для доступа к свойствам доступны следующие методы:

  • getAmountDue()Метод геттер по умолчанию , который amountDueвозвращает текущее значение свойства. Возвращаемое значение этого метода double(а не что-то DoubleProperty). Метод получения должен быть finalобъявлен как.
  • setAmountDue(double)Метод также finalобъявлен как и обеспечивает значение свойства , которое будет установлено снаружи. Ваш параметр тоже double.
  • amountDueProperty()Метод определяет геттер свойства и возвращает саму собственность. Это новое соглашение, состоящее из имени свойства (здесь amountDue ) и слова property .

Свойства представляют особый интерес, если наблюдать их изменения. В модели событий Java есть так называемые триггеры событий ( источники событий ), такие как кнопки или ползунки. Эти события могут исходить от пользователей графического интерфейса, но их также можно проследить до их собственных триггеров. Помимо триггеров событий, существует ряд заинтересованных сторон, так называемых слушателей, которые хотят получать информацию о наступлении определенного события. В этом случае для свойств есть ChangeListener( javafx.beans.value.ChangeListener) addListener(), который можно добавить к свойству с помощью метода, который возвращается с помощью соответствующего метода получения.

Чтобы проиллюстрировать ChangeListener, Mainэкземпляр electricalBillкласса Bill(см. Выше) создается в документации Java в классе :

package application;

import javafx.beans.value.ObservableValue;
import javafx.beans.value.ChangeListener;

public class Main {

    public static void main(String[] args) {
    	Bill electricBill = new Bill();

    	electricBill.amountDueProperty().addListener(new ChangeListener<Object>(){
    		@Override
    		public void changed(ObservableValue<?> o,Object oldVal, Object newVal) {
    			System.out.println("Electric bill has changed!");
    		}
    	});

        electricBill.setAmountDue(100.00);
    }

}

Появляется вывод в консоли Счет за электричество изменился! . Слушатель заметил, что electricBill.setAmountDue(100.00)значение свойства amountDue было изменено, и через changed(...)метод было выведено соответствующее сообщение .

API высокого уровня - это самый простой и быстрый способ использования привязок. Они состоят из двух частей: API-интерфейса Fluent и класса привязки. Fluent API предоставляет множество методов для зависимых объектов, а класс Binding предлагает статические фабричные методы.

В следующем примере два целых числа связаны таким образом, что их значения всегда автоматически добавляются к сумме sum :

package application;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.binding.NumberBinding;

public class Main {

    public static void main(String[] args) {
        IntegerProperty num1 = new SimpleIntegerProperty(1);
        IntegerProperty num2 = new SimpleIntegerProperty(2);

        NumberBinding sum = num1.add(num2);

        System.out.println(sum.getValue());

        num1.set(2);

        System.out.println(sum.getValue());
    }

}

Всего существует три переменных, а именно две зависимые переменные num1и num2связь sum. Зависимые переменные относятся к типу, IntegerPropertyа сама облигация - к типу NumberBinding. sumТаким образом, значение изменяется автоматически, если num1или num2изменяется.

Декларативные описания графического интерфейса

В принципе, графические интерфейсы можно настроить с помощью программного API или указать их в декларативном описании. В случае декларативных интерфейсов расположение компонентов описывается во внешнем файле ресурсов.

FXML

Помимо возможности построения графа сцены с использованием программного кода, JavaFX также предлагает возможность настройки объектов с помощью XML . Благодаря FXML JavaFX предоставляет простой в освоении декларативный язык, который позволяет альтернативное определение графических интерфейсов исключительно через XML. Поскольку XML имеет иерархическую структуру, базовая иерархическая структура графического интерфейса пользователя в контейнерах и компонентах может быть очень хорошо отображена на основе XML. Это также упрощает четкое отделение макета от кода. Кроме того, веб-технологии, такие как CSS (каскадные таблицы стилей), JavaScript, а также другие языки, такие как Groovy, могут быть использованы там, будучи встроенными в код XML и связанными с ним.

Класс javafx.fxml.FXMLLoaderи его метод класса load(...)используются для загрузки ресурса FXML . Здесь относительный путь к *.fxmlфайлу должен быть передан в качестве параметра. Теперь указанный файл можно загрузить как ресурс, и из него javafx.scene.Parentможно сгенерировать объект данного типа . Он передается как параметр конструктору объекта Scene.

Документация Java иллюстрирует разницу между кодом и FXML на следующем простом примере:

Следующий программный код создает графический пользовательский интерфейс, который состоит из одного с заголовком страницыBorderPane вверху и другого с меткой Некоторые данные здесь, в центре : LabelLabel

BorderPane border = new BorderPane();
Label toppanetext = new Label("Page Title");
border.setTop(toppanetext);
Label centerpanetext = new Label ("Some data here");
border.setCenter(centerpanetext);

Тот же интерфейс описан в FXML следующим образом:

<BorderPane>
    <top>
        <Label text="Page Title"/>
    </top>
    <center>
        <Label text="Some data here"/>
    </center>
</BorderPane>

Таким образом, иерархическая структура поверхности может быть очень хорошо представлена ​​в иерархически структурированном языке разметки FXML. Это упрощает добавление компонентов и построение контура графического интерфейса.

Построитель сцены

JavaFX Scene Builder - это графический инструмент, упрощающий создание файлов FXML. С помощью этого инструмента элементы графического интерфейса пользователя можно разрабатывать без знания программирования. Пользователь может использовать перетаскивание для визуального проектирования и создания структур XML из FXML.

Oracle прекратила разработку этого инструмента и выпустила исходный код программы под лицензией типа BSD. В результате Gluon взял на себя техническое обслуживание и коммерческую поддержку.

FXGraph

FXGraph - это простой DSL ( Domain Specific Language ) для определения графа объекта, который реализован в FXML в фоновом режиме. FXGraph происходит из проекта e (fx) clipse, который поддерживает JavaFX в Eclipse . FXGraph более компактен, чем FXML, и отдаленно напоминает JSON .

критика

Бывший сотрудник Sun и основатель Codename One Шай Алмог подтверждает, что у JavaFX не будет светлого будущего. Он делит пользователей JavaFX на три категории: компании с крупными инвестициями в Swing, студенты и преданные фанаты. По словам Алмога, на этом фундаменте сложно построить живое сообщество . Кроме того, Oracle не дает никаких четких сигналов относительно своей будущей приверженности JavaFX. В целом, он называет три основные причины отсутствия будущего у JavaFX:

  • Сам Oracle не использует JavaFX или не использует его в достаточной степени: даже продукты на основе Swing не движутся в направлении JavaFX. Кроме того, в течение некоторого времени сама Oracle не распространяла Scene Builder.
  • JavaFX никогда не оказывал такого влияния, как Swing. Основная целевая группа JavaFX, а именно разработчики Swing, не перешли на новую технологию.
  • Рынок вакансий выглядит мрачно: на сайте вакансий dice.com Альмог нашел только 28 вакансий, требующих знания JavaFX, в отличие от 198 вакансий для Swing, 2333 для Android и 16752 для Java EE (по состоянию на 22 ноября 2015 г.).

После прекращения поддержки ARM Embedded Platform и разработки Scene Builder от Oracle ассоциация iJUG (Ассоциация немецких групп пользователей Java) потребовала от Oracle явного участия в JavaFX. В результате Дон Смит (старший директор по управлению продуктами Oracle) ясно дал понять, что JavaFX по-прежнему будет рекомендованной технологией для разработки богатых клиентов и что в этом отношении она будет развиваться и дальше. Отсутствие поддержки платформы ARM связано с огромными усилиями, необходимыми для обеспечения устойчивой коммерческой поддержки ARM с учетом быстро меняющейся аппаратной технологии. Построитель сцен был доступен по открытой лицензии BSD, и теперь стратегия заключается в интеграции построителя сцен в инструменты и платформы разработки. Смит, в частности, ссылается на стартап Gluon, который занимается портами JavaFX и построителем сцен.

В целом, Java конкурирует с множеством других технологий: на стороне сервера, например, с Node.js и Ruby on Rails , на мобильной стороне с iOS и в мобильной и настольной областях с HTML и JavaScript. Еще предстоит выяснить, утвердится ли JavaFX в качестве технологии для веб-интерфейсов.

Некоторые эксперты видят нишу для JavaFX, в частности, в области мощных настольных клиентов со сложным графическим взаимодействием, в которых он мог бы закрепиться на постоянной основе. Они видят сильные стороны фреймворка не в последнюю очередь в разработке гибридных настольных приложений. Любой, кто разрабатывает клиента с прямым доступом к локальным ресурсам (файловая система, последовательные ресурсы и т. Д.), Находится в надежных руках с JavaFX.

литература

  • Антон Эппле: JavaFX 8. Основы и передовые методы. dpunkt.verlag: Гейдельберг, 2015.
  • Ральф Стейер: Введение в JavaFX. Современные графические интерфейсы для RIA и Java-приложений. Springer Vieweg: Висбаден, 2014.
  • Кристиан Улленбум: Ява - это тоже остров. Введение, обучение, практика. 11-е издание, Galileo Press: Bonn, 2014, особенно стр. 1009-1063.
  • Кристиан Улленбум: Стандартная библиотека Java SE 8. Пособие для Java-разработчиков. 2-е издание, 2014 г., Galileo Press: Bonn, 2014 г., особенно стр. 1031-1076.

веб ссылки

Отдельные ссылки и комментарии

  1. Улленбум: Ява - это тоже остров. 11-е издание, 2014 г., с. 1011.
  2. JavaFX FAQ . Проверено 29 февраля, 2016.
  3. ^ Будущее JavaFX и других обновлений плана клиента Java . Проверено 17 ноября 2018 года.
  4. а б в Улленбум: Ява - это тоже остров. 11-е издание, 2014 г., с. 1011.
  5. JavaFX 1.0 живой ( Memento из с оригинала от 7 декабря 2008 года в Internet Archive ) Info: архив ссылка была вставлена автоматически и еще не была проверена. Проверьте исходную и архивную ссылку в соответствии с инструкциями, а затем удалите это уведомление.  @ 1@ 2Шаблон: Webachiv / IABot / blogs.sun.com
  6. Релиз JavaFX 1.3 ( воспоминание от 30 апреля 2011 г. в Интернет-архиве )
  7. javafx.com ( Memento из в оригинале с 29 октября 2010 года в Internet Archive ) Info: архив ссылка была вставлена автоматически и еще не была проверена. Проверьте исходную и архивную ссылку в соответствии с инструкциями, а затем удалите это уведомление.  @ 1@ 2Шаблон: Webachiv / IABot / javafx.com
  8. Нововведения в JavaFX 2.0 . Netzwelt , по состоянию на 13 октября 2011 г.
  9. а б Улленбум: Ява - это тоже остров. 11-е издание, 2014 г., с. 1012.
  10. Хендрик Эбберс: JavaFX8 - Что нового? In: jaxenter (создан 20 марта 2014 г., по состоянию на 12 декабря 2016 г.).
  11. Примечания к выпуску JDK для ARM 8u33 . Oracle . 16 февраля 2013 г. Получено 29 февраля 2016 г.: « Начиная с JDK 8u33, JavaFX Embedded удаляется из пакета ARM и не поддерживается. "
  12. ^ Oracle Corporation: Обновление дорожной карты клиента Java. Oracle Corporation, 11 мая 2020, доступ к 14 февраля 2021 .
  13. ^ Steyer: Введение в JavaFX. 2014. С. 166–167.
  14. Oracle: JavaFX Architecture In: http://docs.oracle.com (последнее изменение в 2013 г., по состоянию на 14 декабря 2016 г.)
  15. Примечание: не путать с программным обеспечением секретных служб PRISM.
  16. а б в Стейер: Введение в JavaFX. 2014. С. 8.
  17. Геррит Грюнвальд: Визуализация на Java с помощью JavaFX In: heise Developer (создан 28 июня 2013 г., по состоянию на 14 декабря 2016 г.).
  18. ^ Steyer: Введение в JavaFX. 2014. С. 8–9.
  19. Примечание. Метод main () в основном не нужен для приложения JavaFX, хотя он является центральной точкой входа для обычного приложения Java. Он генерируется NetBeans только из соображений безопасности, чтобы гарантировать запуск приложения в случае отсутствия поддержки JavaFX на целевых платформах. Сам Netbeans игнорирует метод main (). См. Steyer: Введение в JavaFX. 2014. 29 с.
  20. Ullenboom: Стандартная библиотека Java SE 8. 2-е издание 2014 г., с. 1032.
  21. Oracle: javafx.application - Class Application на docs.oracle.com (по состоянию на 11 декабря 2016 г.); Эппл: JavaFX 8. 2015, стр. 9-10.
  22. Примечание . Причина в том, что метод init, как и конструктор класса, по-прежнему вызывается потоком запуска приложения. Однако элементы пользовательского интерфейса можно создавать и изменять только в потоке приложения JavaFX. См. Epple: JavaFX 8. 2015, стр. 10.
  23. a b Steyer: Введение в JavaFX. 2014. 29 с.
  24. Эппл: JavaFX 8. 2015, с. 11.
  25. Подробное описание класса Stage см. В Oracle: Class Stage на docs.oracle.com (по состоянию на 11 декабря 2016 г.). См. Также Epple: JavaFX 8. 2015, стр. 11–13.
  26. ^ Steyer: Введение в JavaFX. 2014. С. 29, 65.
  27. Эппл: JavaFX 8. 2015, с. 13.
  28. Oracle: Class Scene на docs.oracle.com (по состоянию на 11 декабря 2016 г.).
  29. Ullenboom: Стандартная библиотека Java SE 8. 2-е издание, 2014 г., с. 1033.
  30. ^ Oracle: Class Group на docs.oracle.com (по состоянию на 11 декабря 2016 г.); Ullenboom: стандартная библиотека Java SE 8. 2-е издание, 2014 г., стр. 1034-1035.
  31. Oracle: Class Control на docs.oracle.com (по состоянию на 11 декабря 2016 г.); Ullenboom: стандартная библиотека Java SE 8. 2-е издание, 2014 г., с. 1034.
  32. Ullenboom: Стандартная библиотека Java SE 8. 2-е издание, 2014 г., с. 1036.
  33. Эппл: JavaFX 8 2015, стр. 43-44; Oracle: Использование элементов управления пользовательского интерфейса JavaFX на docs.oracle.com (по состоянию на 11 декабря 2016 г.)
  34. Джефф Фризен: Изучение класса приложения JavaFX In: JavaWorld (создан 14 апреля 2016 г., по состоянию на 13 декабря 2016 г.).
  35. ^ Steyer: Введение в JavaFX. 2014. 201 с.
  36. Примечание: в отличие от этого, консольные или старые графические программы часто представляют собой линейную или детерминированную последовательность инструкций и / или входных данных, которые обрабатываются одна за другой.
  37. ^ Steyer: Введение в JavaFX. 2014. 201 с.
  38. ^ Steyer: Введение в JavaFX. 2014. 201 с.
  39. ^ Steyer: Введение в JavaFX. 2014. С. 202-205.
  40. ^ Steyer: Введение в JavaFX. 2014. С. 205-209.
  41. а б Ullenboom: 8-я стандартная библиотека Java SE. 2-е издание, 2014 г., с. 1037.
  42. ^ Steyer: Введение в JavaFX. 2014, стр. 193–195; Ullenboom: стандартная библиотека Java SE 8. 2-е издание, 2014 г., стр. 379–388; Эппл: JavaFX 8. 2015, стр. 22–23.
  43. a b Steyer: Введение в JavaFX. 2014. С. 225.
  44. a b c d Oracle: JavaFX: Учебное пособие по свойствам и привязке в : docs.oracle.com (по состоянию на 13 декабря 2016 г.).
  45. Ullenboom: Стандартная библиотека Java SE 8. 2-е издание, 2014 г., стр. 806–807.
  46. ^ Steyer: Введение в JavaFX. 2014, с. 228-231.
  47. Примечание. Это сопоставимо с XAML (Extensible Application Markup Language) из платформы Microsoft .NET.
  48. ^ Steyer: Введение в JavaFX. 2014, стр. 9-10; Ullenboom: стандартная библиотека Java SE 8. 2-е издание, 2014 г., стр. 1062-1063; Улленбум: Ява - это тоже остров. 11-е издание, 2014 г., стр. 1013-1014.
  49. ^ Steyer: Введение в JavaFX. 2014. С. 65–66.
  50. Oracle: Mastering FXML In: http://docs.oracle.com (обновление 2014 г., по состоянию на 14 декабря 2016 г.).
  51. Инструмент доступен по следующему URL-адресу для Windows, OS X и Linux: http://gluonhq.com/labs/scene-builder/
  52. Саймон Виенот : список рассылки openjfx-dev. "Scene Builder теперь имеет открытый исходный код!" . 3 декабря 2013 г. Проверено 29 марта. 2016 г.
  53. ^ Gluon поддерживает Scene Builder . 4 марта 2015. По состоянию на 29 марта. 2016 г.
  54. Tom Schindl: FXGraph In: https://www.eclipse.org/ (последнее изменение 9 декабря 2013 г.; доступ 13 декабря 2016 г.).
  55. Улленбум: Ява - это тоже остров. 11-е издание, 2014 г., с. 1014.
  56. a b Шай Альмог: Следует ли Oracle Spring очищать JavaFX? In: DZone (создана 22 ноября 2015 г., по состоянию на 14 декабря 2016 г.); см. также Майкл Томас: покойся с миром, JavaFX? In: JAXenter (создан 24 ноября 2015 г., по состоянию на 14 декабря 2016 г.).
  57. iJUG: iJUG просит Oracle , чтобы сделать четкую приверженность JavaFX ( сувенира в оригинале с 23 сентября 2016 года в интернет - архив ) Info: архив ссылка была вставлена автоматически и еще не была проверена. Проверьте исходную и архивную ссылку в соответствии с инструкциями, а затем удалите это уведомление. In: iJUG (создано 27 января 2016 г .; обновлено 2 февраля 2016 г .; просмотрено 14 декабря 2016 г.) @ 1@ 2Шаблон: Webachiv / IABot / www.ijug.eu
  58. a b Хартмут Шлоссер: Трудно, но честно: какое будущее у JavaFX? In: JAXenter (создан 22 марта 2016 г., по состоянию на 14 декабря 2016 г.).
  59. JAXenter, Интервью с Александром Касаллом: «Только Чак Норрис может создавать гибридные настольные приложения» В: JAXenter (создан 21 апреля 2015 г., по состоянию на 14 декабря 2016 г.).