JavaFX 是 Java 的下一代**图形用户界面(GUI)**工具包。它是一个可以轻松快速构建高性能 Java 客户端应用的平台。
JavaFX 的底层引擎通过硬件加速图形利用现代 GPU,同时提供设计良好的编程接口,从而使开发人员能够将图形、动画和 UI 控件结合起来。
这些功能允许您为您的客户提供一个引人注目的、复杂的、完全可定制的客户 GUI,这将给他们留下深刻印象。
虽然 Java 最初的目标是嵌入式和客户端世界,但自 2006 年以来,许多原因促使 Java 语言成为企业界的顶级开发平台。
但最近,随着 JavaFX 平台作为标准客户端 GUI 的出现,这些最初的目标又开始流行起来。
尽管 JavaFX 不仅仅是一个 GUI 工具包,但它允许 Java 开发人员创建具有引人注目的用户界面的客户端应用,这些用户界面可以轻松连接到后端系统。
此外,JavaFX 灵活的 FXML 支持允许您轻松构建MVC(模型视图控制器)架构模式应用,并使用场景生成器工具使用 WYSIWYG 方法。
JavaFX 的绑定简化了实体之间的通信,并进一步支持 MVC。除此之外,JavaFX 还使用 CSS 提供了快速、可定制的 UI 建模。
通过添加一个带有文档模型的成熟的WebView
组件,映射到 Java 代码很容易,并为 3D 和媒体功能提供了强大的支持。
在本章中,我们将介绍以下主题:
- 什么是 JavaFX 及其目标平台是什么?
- JavaFX 历史简介
- JavaFX 的目标、特性以及 JavaFX8 的新增功能
- 如何安装 JavaSE8、JavaFX8、NetBeans 和配置环境变量
- 开发*“Hello World”*JavaFX8 应用,了解 JavaFX8 基本应用架构和构建块
JavaFX 诞生于一个主要目标——用于多种类型的设备,如嵌入式设备、智能手机、电视、平板电脑和台式机。JavaFX 也遵循 Java 的写一次,在任何地方运行范式。
JavaFX8 完全是用 Java 语言从头开始编写的,它让您感到宾至如归。因此,用 JavaFX 编写的应用可以部署在台式机、笔记本电脑、Web、嵌入式系统、手机和平板电脑上。
Oracle 不再支持嵌入式系统;这需要 ARM 等公司的支持。javafx2.x 到 8.x 从未支持过移动设备;支持现在只因为OpenJFX而存在。开源将 JavaFX 引入移动环境,社区因此受益匪浅。
有关 OpenJFX 的更多信息,请访问https://wiki.openjdk.java.net/display/OpenJFX/Main 。
JavaFX 是一组图形和媒体包,使开发人员能够在一个包中设计、创建、测试、调试和部署跨不同平台一致运行的富客户端应用,而不需要许多单独的库、框架和 API 来实现相同的目标。这些独立的库包括媒体、UI 控件、WebView
、3D 和 2D API。
因此,如果您是一名 Java 前端开发人员,一名经验丰富的 Java Swing、Flash/Flex、SWT 或 web 开发人员,希望将客户端应用提升到一个新的水平,并且希望为客户开发一个有吸引力且复杂的用户界面,那么您正在学习 JavaFX 技能——本书适合您。
本章是对 JavaFX8 的介绍;我们已经讨论过 JavaFX8 作为一种技术,以及为什么您应该关心它。
接下来,我们将浏览它的历史,探索它的核心功能以及在哪里可以使用它。
在您开始使用本书学习 JavaFX8 之前,我们将通过安装各种必需的软件包来完成开发环境的准备工作,以便能够编译和运行它的许多示例。
在本章中,您将学习如何安装所需的软件,例如****Java 开发工具包 JDK和 NetBeans集成开发环境**(IDE)。**
**安装所需软件后,您将首先创建一个传统的Hello JavaFX 8示例。一旦您对开发环境感到满意,作为最终验证,我们将浏览 Hello JavaFX 8 源代码,以了解基本的 JavaFX 8 应用体系结构。
如果您已经熟悉 JDK 和 NetBeans IDE 的安装,可以跳到第 2 章、JavaFX 8 Essentials 并创建自定义 UI,其中介绍了 JavaFX 8 基础知识以及如何创建自定义 UI 组件。
那你还在等什么?让我们开始吧!
你可能认为 JavaFX 是一种全新的技术,但事实并非如此。JavaFX 在这里已经有很长时间了;自 2005 年以来非正式地。自从 Sun Microsystems 收购该公司SeeBeyond以来,出现了一种图形丰富的脚本语言,称为F3(FormFollowsFFunction),由工程师克里斯·奥利弗创建。
在 JavaOne 2007 年会议上,Sun Microsystems 正式公布了 JavaFX 作为该语言的名称,而不是 F3。在 2007 年至 2010 年期间,甲骨文收购了许多大公司,如 BEA Systems、JD Edwards、Siebel Systems 等。我在 Oracle 工作,负责将不同的客户支持渠道整合到 Oracle 支持网站MetaLink(当时的名称)。
2009 年 4 月 20 日,甲骨文公司宣布收购 Sun Microsystems,使甲骨文成为 JavaFX 的新管理者。
在 JavaOne 2010 上,Oracle 宣布了 JavaFX 路线图,其中包括逐步淘汰 JavaFX1.3 脚本语言并将 JavaFX 平台重新创建为基于 Java 的 API。正如承诺的那样,JavaFX2.0SDK 于 2011 年 10 月在 JavaOne 上发布。
除了 JavaFX2.0 的发布之外,Oracle 还宣布将采取措施使 JavaFX 开源,从而使 Java 的多功能和强大社区能够帮助推动平台向前发展,从而将平台提升到了一个新的水平。使 JavaFX 开源增加了其采用率,加快了 bug 修复的周转时间,并产生了新的增强功能。
在 JavaFX2.1 和 2.2 版本之间,新特性的数量快速增长。JavaFX2.1 是 Mac OS 上 Java SDK 的官方版本。JavaFX2.2 是 Linux 操作系统上 Java SDK 的官方版本。
没有像 JavaFX3.x 这样的东西,但是 Java 开发世界的巨大变化发生在 JavaSE8 发行版上,该发行版于 2014 年 3 月 18 日发布。JavaSE8 有许多新的 API 和语言增强功能,包括Lambdas、流式 API、Nashorn JavaScript 引擎和JavaFXAPI,这些功能正被纳入标准 JDK 捆绑包中,JavaFX 版本成为 JavaFX2.0 的直接继承版本。
要查看 Java SE 8 中的所有新功能,请访问http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html 。
答案是现在。如前所述,JavaSE8 于 2014 年 3 月 18 日发布。对于使用 Java 构建客户端站点应用的开发人员,JavaFX 富 Internet 应用框架现在支持 Java8。
大多数 Java 企业版供应商也支持 Java8。您是否立即迁移到 JavaSE8 取决于您正在从事的项目类型。
事实上,正如 Oracle JDK 支持路线图所述,在 2015 年 4 月之后,Oracle 将不会在其公共下载站点发布 Java SE 7 的进一步更新。
JavaFXAPI 作为Java SE 运行时环境(JRE和 JDK 的完全集成功能提供。JDK 可用于所有主要的桌面平台(Windows、Mac OS X、Solaris和Linux),因此 JavaFX 也将在所有主要的桌面平台上运行。
与 JavaFX8 相关,它支持以下 API:
- 三维图形
- 富文本支持
- 打印 API。
根据 JavaFX 的官方文档,以下特性包含在 JavaFX 8 及更高版本中:
- Java API:JavaFX 是一个 Java 库,由用 Java 代码编写的类和接口组成。
- FXML 和场景生成器:这是一种基于 XML 的声明性标记语言,用于构建 JavaFX 应用用户界面。您可以使用 FXML 编码或使用 JavaFX 场景生成器以交互方式设计 GUI。Scene Builder 生成 FXML 标记,可以将其移植到像 NetBeans 这样的 IDE,您可以在其中添加业务逻辑。此外,生成的 FXML 文件可以直接在 JavaFX 应用中使用。
- WebView:这是一个 web 组件,它使用
WebKit
——一种 HTML 呈现引擎技术,使在 JavaFX 应用中嵌入网页成为可能。WebView
中运行的 JavaScript 可以调用 Java API,反之亦然。 - Swing/SWT 互操作性:现有的 Swing 和 SWT 应用可以从 JavaFX 功能中受益,如丰富的图形、媒体播放和嵌入式 web 内容。
- 内置 UI 控件和 CSS:JavaFX 提供了开发全功能应用所需的所有主要 UI 控件,以及一些特殊控件,如图表、分页和手风琴。组件可以使用标准 web 技术(如 CSS)进行蒙皮。
- 3D 图形功能:包括对 3D 图形库的支持。
- 画布 API:您可以使用画布 API 直接在 JavaFX 场景区域内绘制,画布 API 由一个图形元素(节点)组成。
- 多点触控支持:基于底层平台的能力支持多点触控操作。
- 硬件加速图形管道:JavaFX 图形基于图形渲染管道Prism。当与支持的图形卡或图形处理单元(GPU一起使用时,Prism 引擎可以平滑、快速地呈现 JavaFX 图形。如果系统没有其中一个,则 Prism 默认为软件渲染堆栈。
- 高性能媒体引擎:该引擎提供了一个基于
GStreamer
多媒体框架的稳定、低延迟的媒体框架。媒体管道支持 web 多媒体内容的播放。 - 自包含部署模型:自包含应用包拥有所有应用资源以及 Java 和 JavaFX 运行时的私有副本。它们作为本机可安装软件包分发,并为该操作系统提供与本机应用相同的安装和启动体验。
以下是 Java SE 8 版本的 JavaFX 组件的新特性和重大产品更改的简要总结:
- 新的Modena 主题现在是 JavaFX 应用的默认主题。
- 增加了对额外 HTML5 功能的支持,包括 Web 套接字、Web 工作人员、Web 字体和打印功能。
- 该 API 使您能够使用新的
SwingNode
类将Swing内容嵌入 JavaFX 应用,从而改进 Swing 互操作性功能。 DatePicker
、Spinner
和TableView
内置 UI 控件现在可用。- 它通过
javafx.print
包提供公共 JavaFX 打印 API。 - 已提供对 Hi DPI 显示器的支持。
- CSS 样式化类成为公共 API。
- 推出了定期服务类。
- 3D 图形库已通过几个新的 API 类进行了增强。
- 在此版本中,摄像头 API类增加了主要更新。
- 现在 JavaFX8 支持富文本功能。其中包括双向和复杂的文本脚本,如 UI 控件中的泰语和印地语,以及文本节点中的多行、多样式文本。
- 支持对话框和辅助功能 API。
在附录成为 JavaFX 大师中,我提供了成为 JavaFX 大师所需的所有参考资料(链接、书籍、杂志、文章、博客和工具)和真实 JavaFX 8 生产应用的列表。
下图显示了使用 JavaFX8 构建的Ensemble8.jar
应用,显示了处理各种 JavaFX8 组件、主题和概念的示例。更有趣的是,源代码可供学习和修改–请参阅上一章了解如何安装此应用。
JavaFX8 应用
该应用涵盖了许多主题,尤其是新的 JavaFX 8 3D API,可以在图形 3D 部分找到,如下图所示:
JavaFX83D 应用
到目前为止,我们已经对 JavaFX 有了一个很好的介绍,我和你们一样渴望开始创建和启动我们的第一个"Hello JavaFX 8"
应用。但是,如果没有下载和安装正确的工具,我们就无法创建和编译本书的大部分代码。
您需要下载并安装Java 8 Java 开发工具包(JDK)或更高版本。不是运行时版本(JRE)。
从以下位置下载最新的 Java SE 8u45 JDK 或更高版本:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
从以下链接下载并安装 NetBeans 8.0.2 或更高版本 https://netbeans.org/downloads ,虽然推荐使用 NetBeans IDEAll捆绑包,也可以使用 Java EE 捆绑包,如图所示:
NetBeans 捆绑包下载。
目前,JavaFX 8 在以下操作系统上运行:
- Windows 操作系统(XP、Vista、7、8)32 位和 64 位
- Mac OS X(64 位)
- Linux(32 位和 64 位)、Linux ARMv6/7 VFP、HardFP ABI(32 位)
- Solaris(32 位和 64 位)
本节中概述的步骤将指导您成功下载并安装 Java SE 8。从以下位置下载 Java SE 8 JDK:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
在以下步骤中,将以 Mac OS X Yosemite(10.10.3)操作系统上的 Java SE 8u45 JDK 64 位版本(撰写本文时)为例。
这些步骤在其他操作系统和 JDK 版本上类似。但是,如果您的环境不同,请参阅以下链接以了解更多详细信息:
http://docs.oracle.com/javase/8/docs/technotes/guides/install/toc.html
以下是安装 Java SE 8 JDK 的步骤:
-
Install the Java 8 JDK by launching the image file
jdk-8u45-macosx-x64.dmg
. A screen will appear that looks like the following screenshot once you've launched the JDK 8 setup image file. That's the package setup file. Double-click on it and the installer will launch:JDK 8 安装映像文件
通常,您需要在计算机上拥有管理员权限才能安装软件。
-
Begin the setup of the Java 8 JDK. The screen in the following screenshot will appear at the beginning of the installation process. Click on the Continue button, next on the Installation type screen wizard, click on Install to begin the installation.
JavaSE 开发工具包 8 安装程序
-
Once you hit Install, you may be asked to supply your password. Supply it, click on Ok and the installation will proceed with a progress bar, as shown in following figure:
Java SE 开发工具包 8 正在安装中
-
安装程序将完成 Java 8 SE 开发工具包的安装。点击关闭按钮退出。
现在您需要设置几个关键环境变量。设置它们的方式以及应设置的值因操作系统而异。需要设置的两个变量是:
- JAVA_HOME:这个告诉您的操作系统 JAVA 安装目录在哪里。
- 路径:此指定 Java 可执行目录所在的位置。此环境变量允许系统搜索包含可执行文件的路径或目录。Java 可执行文件位于
JAVA_HOME
主目录下的 bin 目录中。
为了使JAVA_HOME
和PATH
更持久,您需要将它们添加到您的系统中,以使它们在您启动或登录时始终可用。根据您的操作系统,您需要能够编辑环境变量名称和值。
在Windows 环境中,您可以使用键盘快捷键Windows 徽标键+暂停/中断键,然后点击高级系统设置显示系统属性对话框。
接下来,点击环境变量。在这里可以添加、编辑和删除环境变量。您将使用已安装的主目录作为值来添加或编辑JAVA_HOME
环境变量。此屏幕截图显示了 Windows 操作系统上的“环境变量”对话框:
Windows 环境变量
让我们设置环境变量:
-
要为Mac OS X平台设置您的
JAVA_HOME
环境变量,您需要启动一个终端窗口,通过添加以下导出命令来编辑主目录的.bash_profile
文件:export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
-
在使用 Bash shell 环境的Linux和其他Unix操作系统上,启动终端窗口并编辑
~/.bashrc
或~/.profile
文件以包含导出命令:export JAVA_HOME=/usr/java/jdk1.8.0 export PATH=$PATH:$JAVA_HOME/bin
-
在使用
C
shell(csh)环境的 Linux 和其他 Unix 操作系统上,启动终端窗口并编辑~/.cshrc
或~/.login
文件以包含setenv
命令:setenv JAVA_HOME /usr/java/jdk1.8.0_45 setenv PATH ${JAVA_HOME}/bin:${PATH}
设置路径和JAVA_HOME
环境变量后,您需要启动终端窗口并从命令提示符执行以下两个命令来验证设置:
java -version
javac –version
每种情况下的输出都应该显示一条消息,指示语言和运行时的 JavaSE8 版本。
当开发 JavaFX 应用时,您将使用 NetBeans IDE(或您喜欢的任何其他 IDE)。确保下载包含 JavaFX 的正确 NetBeans 版本。要安装 NetBeans IDE,请执行以下步骤:
-
Download the NetBeans IDE 8.0.2 or later from the following location:
-
启动
.dmg
图像文件netbeans-8.0.2-macosx.dmg
。将验证图像,并打开包含安装程序包存档的文件夹netbeans-8.0.2.pkg
;双击它以启动安装程序。将出现一个对话框,其中显示消息:*此软件包将运行一个程序,以确定是否可以安装该软件。*点击继续按钮。 -
启动 NetBeans 安装对话框后,再次单击继续。接下来,接受许可证并点击继续,然后点击同意。
-
Click on the Install button to proceed. The following screenshot shows a Mac security warning prompt; supply your password and click on Install Software.
Mac 安全警告对话框
-
The NetBeans IDE installation processes will begin. The following screenshot shows the installation progress bar:
安装进度
-
Click on the Close button to complete the installation, as shown here:
安装完成
现在,您可以继续创建 JavaFX 应用了。
向您展示创建和构建 JavaFX 应用的最佳方式是使用Hello World
应用。
在本节中,您将使用我们刚刚安装的 NetBeans IDE 来开发、编译和运行基于 JavaFX 的Hello World
应用。
要快速开始使用 NetBeans IDE 创建、编码、编译和运行简单的 JavaFX 风格Hello World
应用,请遵循本节中概述的步骤:
-
在文件菜单中,选择新建项目。
-
从JavaFX 应用类别中,选择JavaFX 应用。点击下一步。
-
Name the project
HelloJavaFX
. Optionally, you can define the package structure for application classes. Then click on Finish as shown in the following screenshot:新建 JavaFX 应用向导
NetBeans 打开
HelloJavaFX.java
文件,并用基本“Hello World”应用的代码填充该文件。您会发现,这个版本的代码与 NetBeans 实际创建的代码相比有了一些修改,您可以对它们进行比较以找出差异,但它们具有相同的结构。我这样做是为了在点击**说“Hello World”**按钮时,在
Scene
的文本节点而不是控制台上显示结果。为此,还使用了一个VBox
容器。 -
Right-click on the project and click on Run from the menu as shown here:
运行应用
-
NetBeans will compile and run the application. The output should be as shown in the following screenshot:
从 NetBeans IDE 启动的 JavaFX Hello World
-
Click on the button and you should see the following result:
JavaFXHelloWorld 结果
下面是 Hello world 基础应用(HelloJavaFX.java
的修改代码:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import static javafx.geometry.Pos.CENTER;
import javafx.scene.layout.VBox;
/**
* @author mohamed_taman
*/
public class HelloJavaFX extends Application {
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
Text message = new Text();
btn.setText("Say 'Hello World'");
btn.setOnAction(event -> {
message.setText("Hello World! JavaFX style :)");
});
VBox root = new VBox(10,btn,message);
root.setAlignment(CENTER);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello JavaFX 8 World!");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
以下是有关 JavaFX 应用基本结构的重要事项:
-
JavaFX 应用的主类应该扩展
javafx.application.Application
类。start()
方法是所有 JavaFX 应用的主要入口点。 -
JavaFX 应用通过阶段和场景定义用户界面容器。JavaFX
Stage
类是顶级 JavaFX 容器。JavaFXScene
类是所有内容的容器。下面的代码片段创建了一个舞台和场景,并使场景以给定的像素大小可见–new Scene(root, 300, 250)
。 -
在 JavaFX 中,场景的内容表示为节点的分层场景图。在本例中,根节点是一个
VBox
布局对象,它是一个可调整大小的布局节点。这意味着根节点的大小跟踪场景的大小,并在用户调整舞台大小时更改。 -
此处使用
VBox
作为容器,将其内容节点垂直排列在一列多行中。我们将按钮btn控件添加到该列的第一行,然后将文本消息控件添加到同一列的第二行,垂直间距为 10 像素,如下代码片段所示:VBox root = new VBox(10,btn,message); root.setAlignment(CENTER);
-
我们使用文本设置按钮控件,并使用事件处理程序将消息文本控件设置为**Hello World!JavaFX 样式:)**当点击按钮时。
-
You might note a strange code syntax written in Java, with no compiler errors. This is a Lambda expression, which has been added to Java SE 8, and we are going to talk about it briefly in Chapter 2, JavaFX 8 Essentials and Creating a custom UI. With a slight comparison to old anonymous inner classes style, it is cleaner and more concise to use Lambda expression now. Have a look at this comparison of code:
老派:
btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { message.setText("Hello World! JavaFX style :)"); } });
新时代:
btn.setOnAction(event -> { message.setText("Hello World! JavaFX style :)"); });
-
当使用 JavaFX Packager 工具创建应用的JAR文件时,JavaFX 应用不需要方法,该工具将 JavaFX 启动器嵌入 JAR 文件中。
-
但是,包含
main()
方法非常有用,这样您就可以运行在没有 JavaFX 启动器的情况下创建的 JAR 文件,例如在使用未完全集成 JavaFX 工具的 IDE 时。此外,嵌入 JavaFX 代码的Swing应用需要main()
方法。 -
在这里,在
main()
方法的入口点中,我们通过简单地将命令行参数传递给Application.launch()
方法来启动 JavaFX 应用。 -
Application.launch()
方法执行后,应用将进入就绪状态,框架内部将调用start()
方法开始。 -
此时,程序在JavaFX 应用线程上执行,而不是在主线程上执行。当调用
start()
方法时,一个 JavaFXjavafx.stage.Stage
对象可供您使用和操作。
高级主题将在下一章中详细讨论。更重要的是,我们将在接下来的章节中介绍 JavaFX 应用线程。在最后三章中,我们将看到如何将来自其他线程的结果引入 JavaFX 应用线程,以便在场景中正确渲染。
到目前为止,您已经了解了什么是 JavaFX,并看到了它的威力。您已经下载并安装了 Java8JDK 和 NetBeansIDE。成功安装必备软件后,您通过 NetBeans IDE 创建了一个 JavaFX Hello World GUI 应用。在学习了如何编译和运行 JavaFX 应用之后,您对源文件HelloJavaFX.java
进行了快速代码演练。
接下来,在第 2 章JavaFX 8 Essentials 和创建自定义中,您将了解 JavaFX 8 体系结构组件和引擎,这些组件和引擎允许 JavaFX 应用在后台高效、平稳地运行。您还将了解最常见的布局 UI 组件,并了解如何将应用作为一个整体或单个场景节点进行主题化。
我们还将介绍 JavaSE8 最重要的特性 Lambda 表达式,以及它的工作原理。然后,我们将深入了解场景生成器作为声明性 UI 和生产工具,然后了解生成的基于 FXML 的标记文档,以及如何将其导入 NetBeans IDE,以继续应用逻辑实现,将其与 FXML 文档中已声明的 UI 控件相关联。
最后,您将能够创建一个自定义 UI 组件,该组件不与默认的 JavaFX8UI 控件捆绑在一起。**