Что такое JavaFX и каковы его ключевые особенности?

«Что такое JavaFX и каковы его ключевые особенности?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

JavaFX — это современный фреймворк для создания кроссплатформенных desktop-приложений с богатым графическим интерфейсом (GUI). Он пришел на смену Swing и предоставляет более мощный и стилизуемый инструментарий.

Ключевые особенности и архитектура:

  • Сцена (Scene Graph): Иерархическая структура узлов (Node), представляющих элементы UI.
  • FXML: Декларативный XML-язык для описания интерфейса, отделяющий логику от представления. Часто используется с визуальным редактором Scene Builder.
  • CSS-стилизация: Полноценная поддержка CSS для оформления элементов.
  • Привязка свойств (Property Binding): Механизм автоматической синхронизации данных между UI и бизнес-логикой.
  • Мультимедиа и 3D: Встроенная поддержка графики, анимации, видео и 3D.

Пример минимального приложения:

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

public class App extends Application {
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello'");
        btn.setOnAction(event -> btn.setText("Hello, JavaFX!"));

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

        Scene scene = new Scene(root, 300, 250);
        primaryStage.setTitle("My App");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) { launch(args); }
}

Важные аспекты разработки:

  • Многопоточность: Работа с UI должна выполняться в JavaFX Application Thread. Для обновления UI из фоновых потоков используется Platform.runLater().
  • Сборка и дистрибуция: Для упаковки приложения со всеми зависимостями (включая JVM) используются jlink (для модульных приложений) или jpackage.