JavaFX 是一个 Java 库,用于开发桌面应用程序以及富 Internet 应用程序 (RIA)。在 JavaFX 中构建的应用程序可以在多个平台上运行,包括 Web、移动和桌面。
JavaFX 旨在取代 Java 应用程序中的 swing 作为 GUI 框架。但是,它提供了比摆动更多的功能。与 Swing 一样,JavaFX 也提供自己的组件并且不依赖于操作系统。它是轻量级和硬件加速的。它支持各种操作系统,包括 Windows、Linux 和 Mac OS。
JavaFX 是由 Chris Oliver 开发的。最初,该项目被命名为Form Follows Functions (F3)。它旨在为 GUI 应用程序开发提供更丰富的功能。后来,Sun Micro-systems于 2005 年 6 月收购了 F3 项目作为JavaFX。
Sun Micro-systems 于2007 年在W3 大会上正式宣布。2008 年 10 月,JavaFX 1.0 发布。2009年,ORACLE公司收购Sun Micro-Systems并发布JavaFX 1.2。JavaFX 的最新版本是 JavaFX 1.8,它于 2014 年 3 月 18 日发布。
| 特点 | 描述 |
|---|---|
| Java 库 | 它是一个 Java 库,由许多用 Java 编写的类和接口组成。 |
| FXML | FXML 是基于 XML 的声明性标记语言。编码可以在 FXML 中完成,以向用户提供更增强的 GUI。 |
| Scene Builder | Scene Builder 生成可移植到 IDE 的 FXML 标记。 |
| 网页视图 | 网页可以嵌入 JavaFX 应用程序。Web View 使用 WebKitHTML 技术嵌入网页。 |
| 内置 UI 控件 | JavaFX 包含不依赖于操作系统的内置组件。UI 组件足以开发一个功能齐全的应用程序。 |
| 类似 CSS 的样式 | JavaFX 代码可以嵌入 CSS 以改进应用程序的样式。我们可以通过简单的 CSS 知识来增强应用程序的视图。 |
| Swing 互操作性 | JavaFX 应用程序可以使用 Swing Node 类嵌入 Swing 代码。我们可以使用 JavaFX 的强大功能更新现有的 Swing 应用程序。 |
| Canvas API | Canvas API 提供了在 JavaFX 场景区域中直接绘制的方法。 |
| 丰富的 API 集 | JavaFX 提供了一组丰富的 API 来开发 GUI 应用程序。 |
| 集成图形库 | 提供了一组集成的类来处理 2D 和 3D 图形。 |
| 图形管道 | JavaFX 图形基于图形渲染管道(棱镜)。它提供了硬件加速的流畅图形。 |
| 高性能媒体引擎 | 媒体管道支持以低延迟播放网络多媒体。它基于 Gstreamer 多媒体框架。 |
| 自包含的应用程序部署模型 | 自包含应用程序包具有所有应用程序资源以及 Java 和 JavaFX 运行时的私有副本。 |
JavaFX 架构的顶层包含一个 JavaFX 公共 API,它提供负责执行全功能 JavaFX 应用程序的所有必要类。该 API 的所有包列表如下。
| 包名 | 描述 |
|---|---|
| javafx.animation | 提供一组负责基于过渡的动画的类 |
| javafx.application | 提供应用程序生命周期方法 |
| javafx.collections | 提供可以处理集合和相关实用程序的类 |
| javafx.concurrent | 提供负责多任务处理的类 |
| javafx.embed.swing | 提供可以在swing代码中使用的一组类 |
| javafx.embed.swt | 提供可以在 swt 代码中使用的一组类 |
| javafx.event | 提供处理事件及其处理的类 |
| javafx.fxml | 包含负责从标记加载层次结构的一组类 |
| javafx.geometry | 提供包含在对象上操作 2D 几何体的方法的 2D 类。 |
| javafx.scene | 提供处理场景图 API 的类 |
| javafx.scene.canvas | 提供处理画布的一组类。 |
| javafx.scene.control | 包含所有 JavaFX 组件的类。 |
| javafx.scene.effect | 包含将图形效果应用于场景图节点的一组类 |
| javafx.scene.image | 提供一组用于加载和显示图像的类 |
| javafx.scene.input | 为鼠标和键盘事件提供一组类 |
| javafx.scene.layout | 提供一组类以支持用户界面布局 |
| javafx.scene.media | 提供将音频和视频集成到 JavaFX 应用程序中的一组类 |
| javafx.scene.paint | 提供一组颜色和渐变类,以在渲染场景图时填充形状和背景。 |
| javafx.scene.shape | 提供对与 2D 几何相关的对象执行操作的一组 2D 类。 |
| javafx.scene.text | 为字体和呈现文本节点提供一组类。 |
| javafx.scene.transform | 提供用于对对象执行旋转、缩放、剪切操作的一组类。 |
| javafx.scene.web | 提供加载和显示 Web 内容的方法。 |
| javafx.stage | 为 JavaFX 内容提供顶级容器类。 |
| javafx.util | 提供实用程序类 |
| javafx.util.converter | 此包用于 JavaFX 的标准字符串转换器 |
官方的API文档说明: https://openjfx.cn/javadoc/17/
它是构建 JavaFX 应用程序的起点。它是一个分层的节点树,代表用户界面的所有视觉元素。它还具有处理事件的能力。一般来说,场景图可以定义为节点的集合。
每个节点都有其单独的 id、样式和音量。场景图的每个节点只能有一个父节点和零个或多个子节点。
场景图上的所有实现实际上都应用于其节点。它们是**javafx.scene **包中存在的各种类,用于在节点上创建、修改和应用一些转换。稍后我们将详细讨论场景图。
JavaFX 图形引擎为场景图提供图形支持。它基本上支持 2D 和 3D 图形。当系统上的图形硬件无法支持硬件加速渲染时,它会提供软件渲染。
JavaFX 中的两个图形加速管道是:
棱镜
棱镜可以看作是高性能硬件加速图形管道。它具有渲染 2D 和 3D 图形的能力。Prism 实现了在不同平台上呈现图形的不同方式。
量子工具包
Quantum Tool Kit 用于将棱镜和玻璃窗工具套件绑定在一起,并使它们可用于堆栈中的上述层。
Glass Window工具包
它位于 JavaFX 图形堆栈的最低级别。它基本上可以看作是一个平台相关层,作为 JavaFX 平台和本机操作系统之间的接口。
它负责提供操作系统服务,例如管理窗口、定时器、事件队列和表面。
网页视图
我们还可以将 HTML 内容嵌入到 JavaFX 场景图中。为此,JavaFX 使用了一个名为 Web 视图的组件。Web 视图使用 web kit,它是一个内部开源浏览器,可以渲染 HTM5、DOM、CSS、SVG 和 JavaScript。
使用 Web 视图,我们可以从 JavaFX 应用程序渲染 HTML 内容,并将一些 CSS 样式应用到用户界面。那么我们写出来的ui就会非常的漂亮了,不次于主流的GUI语言了
媒体引擎
通过使用媒体引擎,JavaFX 应用程序可以支持音频和视频媒体文件的播放。JavaFX 媒体引擎依赖于称为 G Streamer 的开源引擎。包javafx.scene.media包含可以为 JavaFX 应用程序提供媒体功能的所有类和接口。

JavaFX 应用程序按层次划分为三个主要组件,即Stage、Scene 和Nodes。我们需要在每个 JavaFX 应用程序中导入javafx.application.Application类。这为 JavaFX 应用程序提供了以下生命周期方法。
为了创建一个基本的 JavaFX 应用程序,我们需要:
Stage(阶段)
JavaFX 应用程序中的Stage类似于Swing 应用程序中的Frame。它充当所有 JavaFX 对象的容器。Primary Stage 由平台内部创建。应用程序可以进一步创建其他阶段。初级阶段的对象传递给start方法。我们需要在初级阶段对象上调用show方法以显示我们的初级阶段。最初,初级阶段如下所示。

但是,我们可以向这个初级阶段添加各种对象。对象只能以分层方式添加,即首先将场景图(Scene)将添加到这个Stage,然后该场景图可能包含节点。节点可以是用户界面的任何对象,如文本区域、按钮、形状、媒体等。
Scene(场景)
Scene场景实际上包含 JavaFX 应用程序的所有物理内容(节点)。Javafx.scene.Scene类提供了处理场景对象的所有方法。为了使舞台上的内容可视化,创建场景是必要的
Scene Graph(场景图)
Scene Graph场景图存在于层次结构的最低级别。它可以看作是各种节点的集合。节点是在舞台上可视化的元素。它可以是任何按钮、文本框、布局、图像、单选按钮、复选框等。
节点以树状结构实现。场景图中总是有一个根。这将充当场景图中存在的所有其他节点的父节点。但是,此节点可以是 JavaFX 系统中可用的任何布局。
叶节点存在于树层次结构中的最低级别。场景图中的每个节点都代表javafx.scene包的类,因此我们需要将包导入到我们的应用程序中,以创建一个功能齐全的 javafx 应用程序。

自己创一个TestDemo的java文件然后运行注意看下面的注释
package com.example.javafxdemo;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class TestDemo extends Application {
/**
* 程序入口
*
* @param stage 窗口
* @throws Exception
*/
@Override
public void start(Stage stage) throws Exception {
// 创建一个按钮
Button btn1 = new Button("Say, Hello World");
// 创建一个按钮的点击事件回调
btn1.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
System.out.println("hello world");
}
});
// 创建一个栈面板
StackPane root=new StackPane();
root.setMinHeight(300);//设置最小高度
root.setMinWidth(300);//设置最小宽度
root.getChildren().add(btn1);//将按钮添加到栈面板中,默认居中
Scene scene=new Scene(root);//创建一个场景,将栈面板添加到场景中
stage.setScene(scene);//将场景添加到舞台中
stage.setTitle("第一个JavaFX程序");//设置舞台标题
stage.show();//显示舞台
}
public static void main(String[] args) {
launch(args);//启动程序
}
}

当点击中的按钮后,就会触发按钮的回调然后在控制台中打印
