Гид по JavaFX: разрабатываем GUI на Java
Август 18, 2022
Хотя пальма первенства в разработке десктопных приложений принадлежит не Java, у нее есть удобный и мощный инструмент для создания клиентских приложений с насыщенным графическим интерфейсом — JavaFX. Эта технология, развивающаяся в рамках проекта OpenJFX, обеспечивает разработчиков всем, что мы так любим в Java:
- Превосходной кросс-платформенной совместимостью
- Современными готовыми решениями для создания UI
- Четким графиком обновлений
- Удобными инструментами для написания понятного, легко контролируемого кода
Узнайте, почему для следующего GUI-проекта следует отдать предпочтение Java, а не .NET или JavaScript!
Что такое JavaFX
JavaFX — это опенсорсная платформа, содержащая пакеты с графическими и медиа-инструментами для разработки и развертывания клиентских приложений с насыщенным графическим пользовательским интерфейсом (GUI). Клиентские приложения хранят данные и выполняют большую часть своих функций на локальной машине (ПК). Приложения JavaFX работают в десктопной, веб, мобильной и встроенной среде. Они также могут ссылаться на API других Java-библиотек и тем самым использовать все возможности языка и подключаться к серверным приложениям.
JavaFX: Обзор технологии
История
В Java с самых ранних версий присутствовали библиотеки для создания графики. Сначала на Java писали апплеты, небольшие приложения, встраиваемые в веб-браузер. Но по мере того, как рос спрос на комплексные десктопные приложения, язык пополнялся новым функционалом. Первые версии Java включали в себя только AWT (Abstract Window Toolkit), низкоуровневый абстрактный графический API. В 1998 г. появилась библиотека Swing, расширяющая возможности AWT.
JavaFX был включен в JDK в 2008 г. Первая версия JavaFX состояла из средств разработки и скриптового языка. Во второй версии скриптовый язык заменили на привычный разработчикам набор Java-библиотек.
Начиная с Java 11, JavaFX не входит в состав JDK, но продолжает жить и развиваться в рамках отдельного опенсорсного проекта OpenJFX.
Чем полезен JavaFX?
Язык Java отличается универсальностью, но поскольку в последние годы он сосредоточился на покорении облачных сервисов, область десктопной разработки была захвачена другими технологиями. Большинство десктопных приложений разрабатываются с применением WPF (Windows), Qt/Gtk (Linux), SwiftUI/AppKit (Mac) и кросс-платформенных JavaScript-фреймворков. Зачем же тогда нужен JavaFX? Вот несколько причин:
- JavaFX позволяет разработчикам писать понятный, управляемый код на Java, который удобно обновлять и отлаживать. Писать код для десктопных приложений на JavaScript гораздо сложнее, а у .NET возникают проблемы с кросс-платформенной совместимостью
- Разработчики, уже работавшие с Java или Java-подобными языками, с легкостью освоят JavaFX
- JavaFX включает в себя все библиотеки, необходимые для разработки GUI, и поддерживает CSS, FXML и многопоточность. Он обеспечивает разработчиков многочисленными готовыми инструментами (см. раздел ниже) и удобным JavaFX Scene Builder, визуальным инструментом для разработки пользовательских интерфейсов без необходимости написания кода
- JavaFX — опенсорсная технология, поддерживаемая сильным Java-сообществом. Обновления с патчами безопасности и другими фиксами выходят регулярно, и даже когда Oracle прекратит поддержку JavaFX в Java 8 в 2025 г., JavaFX продолжит развиваться в проекте OpenJFX
- Благодаря поддержке технологии нативных образов, добавленной в Axiom NIK версии 21.3 и выше, приложение JavaFX можно преобразовать в нативный исполняемый файл, который занимает меньше места на диске и запускается за долю секунды
Возможности JavaFX
JavaFX обладает впечатляющим набором API для создания таблиц, кнопок, деревьев, меню и остальных компонентов GUI. Он также поддерживает CSS, 2D и 3D графику и WebView. Ниже представлен список функций JavaFX с примерами инструментов для наглядности:
- Базовый функционал (FXML, Stage, Scene и т.д.)
- Макеты (HBox, VBox, Border Pane, Text Flow, Flow Panel и т.д.)
- Управление UI (Label, Button, TextField, MenuBar и т.д.)
- Управление контейнером (Accordion, TablePane и т.д.)
- Веб (WebView и т.д.)
- Диаграммы (PieChart, BarChart и т.д.)
- Другие утилиты (шрифты, анимация, эффекты и т.д.)
Подробное описание всех модулей, классов и прочих составляющих JavaFX содержится в документации (на английском языке).
Дополнительные ресурсы
Многочисленные библиотеки, фреймворки и сторонние ресурсы повышают удобство использования и расширяют потенциал JavaFX. Библиотеки позволяют разработчиками создавать красивые пользовательские интерфейсы с минимальным количеством кода под капотом, а фреймворки предоставляют дополнительный функционал.
Рассмотрим некоторые из этих ресурсов для демонстрации возможностей платформы:
- MigLayout — это опенсорсная библиотека для разработки разнообразных макетов и управления ими. С помощью MigLayout можно писать лаконичный код, дающий четкое представление о созданном макете
- Ikonli — это библиотека, содержащая множество пакетов для создания кастомных иконок
- RichTextFX включает в себя инструменты для создания насыщенных текстовых редакторов и редакторов кода с выделением синтаксических элементов и различными шрифтами
- JacpFX — это фреймворк, помогающий структурировать приложение с помощью слабо связанных многоразовых компонентов JavaFX. Выполнение задачи можно сделать независимым от внесения изменений в пользовательский интерфейс клиентского приложения, тем самым избежав проблем с многопоточностью. JacpFX поддерживает асинхронные процессы и коммуникацию на основе шины сообщений
- Skija обеспечивает Java-биндинги для Skia, популярной опенсорсной библиотеки для создания насыщенной 2D графики, которая использовалась в разработке Google Chrome, Android, LibreOffice и т.д. Библиотека предоставляет высокопроизводительные и надежные инструменты разработки и поддерживает работу с цветовым пространством, современную типографию, GPU-бэкенд и высоко оптимизированный GPU-рендеринг
В GitHub-репозитории jjenkov вы найдете большое количество демо приложений JavaFX, демонстрирующих работу разных компонентов фреймворка. Помимо этого, на сайте проекта OpenJFX содержатся все необходимые руководства, тьюториалы и документация для освоения данной технологии.
Области применения
Хотя многие рабочие процессы переместились с ПК в интернет, десктопные приложения не теряют актуальности. Они характеризуются более продвинутым GUI, высокой производительностью и надежностью, а в некоторых случаях просто не имеют альтернатив. Области применения десктопных приложений включают, помимо прочего:
- IDE
- Редакторы графики/текста
- Редакторы/проигрыватели аудио и видео
- Некоторые игры
Кроме того, у некоторых мобильных и веб-приложений, таких как Skype, WhatsApp, Telegram и Slack есть десктопные версии. Поэтому этот сегмент никуда не исчезнет, а JavaFX остается полезным инструментом в арсенале разработчика.
Но JavaFX применяется не только в десктопной разработке. Например, приложения JavaFX можно преобразовать в нативные образы и использовать на мобильных устройствах: Gluon предлагает необходимые инструменты, а Axiom NIK можно использовать для быстрого и удобного внедрения технологии нативных образов в проект на Java.
JavaFX также поддерживается многими встроенными системами, например, Raspberry Pi.
Дорожная карта поддержки
JavaFX все еще входит в состав Oracle Java 8 и будет поддерживаться до марта 2025 г. График релизов OpenJFX основан на ежеквартальных обновлениях с устранением проблем безопасности и багов. Сообщество предоставляет минорные и LTS (с долгосрочной поддержкой) версии, а коммерческая поддержка от Gluon доступна по запросу. Axiom JDK поддерживает JavaFX в рамках Axiom JDK (об этом ниже).
Релиз | Дата выхода | Последняя версия | Долгосрочная поддержка |
---|---|---|---|
Java 11 | Сентябрь 2018 г. | 11.0.16 (июль 2022 г.) | Да |
Java 17 | Сентябрь 2021 г. | 17.0.4 (июль 2022 г.) | Да |
Java 18 (текущая версия) | Март 2022 г. | 18.0.2 (июль 2022 г.) | Нет |
Java 19 | Сентябрь 2022 г. (планируется) | Ранний доступ | Нет |
JavaFX поставляется в виде SDK для конкретной платформы, jmods или набора артефактов. Если вы хотите использовать ПО со своим рантаймом, скачайте необходимый пакет с сайта разработчика.
Axiom JDK поставляет специальную версию среды разработки и исполнения Axiom JDK (версия Full), содержащую AxiomFX на базе OpenJFX.
JavaFX, внедренный в рантайм, дает вам следующие преимущества:
- Сведите к минимуму время и усилия на установку JavaFX в качестве отдельного плагина
- Получайте своевременные обновления ПО вместе с обновлениями рантайма
- Получайте экспертную поддержку на русском языке в рамках поддержки JDK
Кликните по кнопке ниже, чтобы перейти в Центр загрузок Axiom JDK.
JavaFX или Swing?
Вероятно, к этому моменту у вас возник вопрос: «Если JDK уже содержит Swing, зачем мне JavaFX?»
JavaFX был разработан для замены устаревшего Swing, в котором отсутствуют многие современные функции. Поэтому у него гораздо больше возможностей для десктопной разработки, чем у Swing, что подтверждает приведенное ниже сравнение двух технологий:
JavaFX | Swing |
---|---|
Подходит для разработки насыщенных клиентских приложений с современным пользовательским интерфейсом | Библиотека для разработки стандартных GUI |
Чистый код | Много устаревших фич |
Встроенная поддержка MVC | Недостаточная поддержка MVC |
Поддерживается и разрабатывается сообществом; постоянно внедряются новые фичи и улучшения | Новые фичи не добавляются |
Поддержка стилей CSS | Создание стилей только с помощью кода |
Встроенный API для работы с многопоточностью | Нет встроенного API для работы с многопоточностью |
FXML для декларативного создания макетов | Не поддерживает декларативное создание макетов |
Встроенная поддержка 3D графики | Требуются дополнительные API для 3D |
Поддерживает привязку свойств (при связке компонентов изменение в одном компоненте автоматически отражается на другом) | Не поддерживает привязку свойств |
Отсоединен от JDK, начиная с Java 11 | Входит в состав JDK |
Давайте сравним два приложения на JavaFX и Swing с кастомизацией кнопки:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.scene.transform.Scale;
import javafx.stage.Stage;
public class ScaleTransformationDemo extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
Button button = new Button();
button.setText("Click me!");
Scale scaleTransformation = new Scale();
scaleTransformation.setX(3.0);
scaleTransformation.setY(2.0);
scaleTransformation.setPivotX(0);
scaleTransformation.setPivotY(0);
button.getTransforms().add(scaleTransformation);
VBox vbox = new VBox(button);
Scene scene = new Scene(vbox);
primaryStage.setScene(scene);
primaryStage.setWidth(512);
primaryStage.setHeight(256);
primaryStage.show();
}
}
Пример выше, в котором выполняется масштабирование размера, был взят из руководства по созданию кнопки на JavaFX (на английском языке). Процесс кастомизации на Swing выглядит по-другому:
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.basic.BasicButtonUI;
import java.awt.*;
public class ButtonCustomization extends BasicButtonUI {
public static void main(String[] args) {
JFrame f = new JFrame("Button UI Test");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel p = new JPanel();
p.setBackground(Color.white);
f.setContentPane(p);
p.setLayout(new FlowLayout(5, 5, 5));
p.setBorder(new EmptyBorder(10, 10, 10, 10));
final JButton button = new JButton("Click me!");
button.setFont(new Font("Calibri", Font.PLAIN, 14));
button.setBackground(new Color(0x2dce98));
button.setForeground(Color.white);
button.setUI(new ButtonCustomization());
p.add(button);
f.pack();
f.setLocation(500, 500);
f.setVisible(true);
}
@Override
public void installUI(JComponent c) {
super.installUI(c);
AbstractButton button = (AbstractButton) c;
button.setOpaque(false);
button.setBorder(new EmptyBorder(5, 15, 5, 15));
}
@Override
public void paint(Graphics g, JComponent c) {
AbstractButton b = (AbstractButton) c;
paintBackground(g, b, b.getModel().isPressed() ? 2 : 0);
super.paint(g, c);
}
private void paintBackground(Graphics g, JComponent c, int yOffset) {
Dimension size = c.getSize();
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(c.getBackground().darker());
g.fillRoundRect(0, yOffset, size.width, size.height - yOffset, 10, 10);
g.setColor(c.getBackground());
g.fillRoundRect(0, yOffset, size.width, size.height + yOffset - 5, 10, 10);
}
}
Форматировать стили на Swing с помощью кода сложно, для упрощения задачи используйте CSS, поддерживаемый JavaFX. Подробная информация содержится в Справочном руководстве по JavaFX CSS (на английском языке).
Теперь, если мы хотим анимировать созданную с помощью JavaFX кнопку, нам понадобится класс ScaleTransition
и несколько строк кода. В Swing это сделать гораздо сложнее, так как в нем нет ни подходящих классов, ни поддержки многопоточности.
Заключение
Java в очередной раз подтверждает свою универсальность благодаря JavaFX. Хотя компании, работающие с .NET или JavaScript, вряд ли перейдут на другие технологии, если вы работаете с Java и хотите создать десктопную версию своего продукта, JavaFX — то, что вам нужно! А технология нативных образов сделает ваши приложения еще меньше, быстрее и удобнее. Поэтому подпишитесь на нашу рассылку, чтобы не пропустить тьюториал по преобразованию JavaFX-приложения в нативный образ посредством Axiom NIK.