ZetCode

JavaFX 简介

最后修改于 2023 年 10 月 18 日

这是一个 JavaFX 简介教程。本教程的目的是让你开始使用 JavaFX。

关于 JavaFX

JavaFX 是一个用于开发和交付富互联网应用程序 (RIA) 的软件平台,这些应用程序可以在各种设备上运行。JavaFX 是 Java 平台的下一代 GUI 工具包。它与最新版本的 Java SE 运行时环境 (JRE) 和 Java 开发工具包 (JDK) 完全集成。

JavaFX 具有以下主要部分

Prism 是一个用于 2D 和 3D 图形的高性能图形引擎。Glass 窗口工具包是一个与平台相关的层,它将 JavaFX 连接到原生操作系统。它提供原生操作系统服务,例如管理窗口、事件、计时器和表面。媒体引擎提供了创建媒体应用程序的工具,这些应用程序能够在受支持的平台上在桌面窗口或网页中进行媒体播放。Web 引擎是一个 Web 浏览器引擎,支持 HTML5、CSS、JavaScript、DOM 和 SVG。

注意: 从 Java 11 开始,JavaFX 不再是 Java SE 发行版的一部分。JavaFX SDK 必须单独下载。

JavaFX 应用程序的解剖

Application 是 JavaFX 程序的主要类。每个 JavaFX 程序都必须扩展 Application 类。它的 start 方法是应用程序的主要入口点;它是系统准备就绪后调用的第一个方法。JavaFX 应用程序不需要 main 方法;当应用程序在某些情况下无法启动时,它可以用作备用方案。

一个 JavaFX 应用程序由一个 Stage 和一个 Scene 组成。Stage 是顶级容器,是应用程序的主窗口。(对于嵌入在 Web 浏览器中的应用程序,它是主要的矩形区域。)SceneStage 的可视内容的容器。Scene 的内容组织在一个 *场景图* 中。这两个术语反映了从桌面应用程序到更通用的富互联网应用程序的转变。

场景图

场景图是一个节点的分层树,表示应用程序用户界面的所有视觉元素。场景图中单个元素称为节点。每个节点都是一个分支节点或一个叶节点。分支节点可以包含其他节点——它们的子节点。叶节点不包含其他节点。树中的第一个节点称为*根节点*;根节点没有父节点。

节点的具体实现包括图形原语、控件、布局管理器、图像或媒体。可以通过修改节点属性来操作场景。通过这种方式,我们可以对节点进行动画处理、应用效果、进行变换或更改其不透明度。

构建 JavaFX 应用程序

要构建 JavaFX 应用程序,我们需要 javafx-controls 依赖项和 javafx-maven-plugin 插件。

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zetcode</groupId>
    <artifactId>FirstEx</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>13</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.3</version>
                <configuration>
                    <mainClass>com.zetcode.FirstEx</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

这是一个示例 Maven POM 文件。

<configuration>
    <mainClass>com.zetcode.FirstEx</mainClass>
</configuration>

我们需要提供主应用程序类的路径。

$ mvn javafx:run

我们使用 mnv javafx:run 命令运行该示例。

JavaFX 第一个示例

在本节中,我们将介绍一个简单的 JavaFX 应用程序。

com/zetcode/FirstEx.java
package com.zetcode;

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

public class FirstEx extends Application {

    @Override
    public void start(Stage stage) {

        initUI(stage);
    }

    private void initUI(Stage stage) {

        var root = new StackPane();

        var scene = new Scene(root, 300, 250);

        var lbl = new Label("Simple JavaFX application.");
        lbl.setFont(Font.font("Serif", FontWeight.NORMAL, 20));
        root.getChildren().add(lbl);

        stage.setTitle("Simple application");
        stage.setScene(scene);
        stage.show();
    }

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

该示例在应用程序窗口的中间显示文本。

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

基本的 JavaFX 类、集合和属性位于 javafx 包中。

public class FirstEx extends Application {

Application 是 JavaFX 程序的主要类。

@Override
public void start(Stage stage) {

    initUI(stage);
}

Applicationstart 方法被重写。start 方法是 JavaFX 程序的主要入口点。它接收一个 Stage 作为其唯一的参数。(Stage 是主应用程序窗口或区域。)用户界面在 initUI 方法中构建。

var root = new StackPane();

StackPane 是用于组织节点的容器。它使用一个简单的布局管理器,将它的内容节点放置在一个从后到前的单一堆栈中。在我们的例子中,我们只想居中一个节点。

var scene = new Scene(root, 300, 250);

Scene 是场景图中所有内容的容器。它将一个根节点作为其第一个参数。StackPane 是此场景图中的根节点。接下来的两个参数指定场景的宽度和高度。

var lbl = new Label("Simple JavaFX application.");
lbl.setFont(Font.font("Serif", FontWeight.NORMAL, 20));

创建一个 Label 控件,并使用 setFont 方法设置其字体。Label 是一个不可编辑的文本控件。

root.getChildren().add(lbl);

标签控件被添加到 StackPane 中。getChildren 方法返回窗格的子节点列表。

stage.setTitle("Simple application");

StagesetTitle 方法设置主窗口的标题。

stage.setScene(scene);

使用 setScene 方法将场景添加到 stage 中。

stage.show();

show 方法在屏幕上显示窗口。

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

不需要传统的 main 方法。它仅用作在 JavaFX 启动无法正常工作的情况下的备用方案。

First JavaFX application
图:第一个 JavaFX 应用程序

Swing 和 SWT

Swing 是 Java 的第一个主要的 GUI 工具包。它是一个强大而灵活的 GUI 库。Swing 在企业应用程序中很受欢迎。创建 JavaFX 的一个动机是很难使 Swing 适应用户界面的新趋势。因此,决定创建 JavaFX 作为一个全新的工具包。

标准小部件工具包 (SWT) 是一个用于 Java 的第三方 GUI 库。SWT 使用原生 GUI API,如 Windows API 或 GTK+,通过 Java 本地接口 (JNI) 创建其小部件。SWT 不是 JDK 的一部分。它作为外部依赖项提供。SWT 最初由 IBM 公司开发。现在它是由 Eclipse 社区维护的开源项目。

这是 JavaFX 的一个介绍。