JavaFX — функции, преимущества, примеры кода

Гид по JavaFX: разрабатываем GUI на Java


Август 18, 2022


Хотя пальма первенства в разработке десктопных приложений принадлежит не Java, у нее есть удобный и мощный инструмент для создания клиентских приложений с насыщенным графическим интерфейсом — JavaFX. Эта технология, развивающаяся в рамках проекта OpenJFX, обеспечивает разработчиков всем, что мы так любим в Java:

  • Превосходной кросс-платформенной совместимостью
  • Современными готовыми решениями для создания UI
  • Четким графиком обновлений
  • Удобными инструментами для написания понятного, легко контролируемого кода

Узнайте, почему для следующего GUI-проекта следует отдать предпочтение Java, а не .NET или JavaScript!

  1. Что такое JavaFX
  2. JavaFX: Обзор технологии
    1. История
    2. Чем полезен JavaFX?
    3. Возможности JavaFX
    4. Дополнительные ресурсы
    5. Области применения
    6. Дорожная карта поддержки
  3. JavaFX или Swing?
  4. Заключение

Что такое 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

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
Сравнительная таблица Swing и JavaFX

Давайте сравним два приложения на 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.

Author image

Олег Чирухин

Директор по коммуникациям с разработчиками (DevRel)

Команда Axiom JDK roman.karpov@axiomjdk.ru Команда Axiom JDK logo Axiom Committed to Freedom 199 Obvodnogo Kanala Emb. 190020 St. Petersburg RU +7 812-336-35-67 Команда Axiom JDK 199 Obvodnogo Kanala Emb. 190020 St. Petersburg RU +7 812-336-35-67