文档



JavaFX:JavaFX入门指南
2 理解JavaFX架构(8版)

2 理解JavaFX架构

本章对JavaFX架构和生态系统进行了高层次描述。

图2-1展示了JavaFX平台的架构组件。图后的章节描述了每个组件以及它们之间的相互连接。在JavaFX公共API之下是运行JavaFX代码的引擎。它由多个子组件组成,包括一个称为Prism的高性能JavaFX图形引擎,一个小巧高效的窗口系统Glass,一个媒体引擎和一个Web引擎。尽管这些组件没有公开暴露,但它们的描述可以帮助您更好地理解JavaFX应用程序的运行机制。

图2-1 JavaFX架构图

图2-1的描述如下
"图2-1 JavaFX架构图"的描述

场景图

JavaFX场景图是构建JavaFX应用程序的起点,它作为图2-1中顶层的一部分显示,它是一个节点的层次树,表示应用程序用户界面的所有可视元素。它可以处理输入并进行渲染。

场景图中的单个元素称为节点。每个节点都有一个ID、样式类和边界体积。除了场景图的根节点外,场景图中的每个节点都有一个父节点和零个或多个子节点。它还可以具有以下内容:

  • 效果,如模糊和阴影

  • 不透明度

  • 变换

  • 事件处理程序(如鼠标、键盘和输入法)

  • 应用程序特定状态

与Swing和Abstract Window Toolkit(AWT)不同,JavaFX场景图还包括图形原语,如矩形和文本,除了控件、布局容器、图像和媒体。

对于大多数用途,场景图简化了与UI的工作,特别是在使用丰富的UI时。使用javafx.animation API和声明性方法(如XML文档),可以快速实现场景图中各种图形的动画效果。

javafx.scene API允许创建和指定多种类型的内容,例如:

  • 节点:形状(2D和3D)、图像、媒体、嵌入式Web浏览器、文本、UI控件、图表、组和容器

  • 状态:变换(节点的定位和方向)、视觉效果和内容的其他视觉状态

  • 效果:简单的对象,可以改变场景图节点的外观,如模糊、阴影和颜色调整

更多信息,请参阅使用JavaFX场景图文档。

JavaFX功能的Java公共API

JavaFX架构的顶层如图2-1所示,提供了一套完整的Java公共API,支持丰富的客户端应用程序开发。这些API提供了无与伦比的自由和灵活性,用于构建丰富的客户端应用程序。JavaFX平台将Java平台的最佳功能与全面的沉浸式媒体功能结合在一起,形成直观而全面的一站式开发环境。这些JavaFX功能的Java API:

  • 允许使用强大的Java功能,如泛型、注解、多线程和Lambda表达式(在Java SE 8中引入)。

  • 使Web开发人员更容易从其他基于JVM的动态语言(如Groovy和JavaScript)中使用JavaFX。

  • 允许Java开发人员使用其他系统语言(如Groovy)编写大型或复杂的JavaFX应用程序。

  • 允许使用绑定,其中包括对高性能延迟绑定、绑定表达式、绑定序列表达式和部分绑定重新评估的支持。其他语言(如Groovy)可以使用此绑定库引入类似于JavaFX Script的绑定语法。

  • 扩展Java集合库,包括可观察列表和映射,允许应用程序将用户界面与数据模型连接起来,观察这些数据模型的变化,并相应地更新相应的UI控件。

JavaFX的API和编程模型是JavaFX 1.x产品线的延续。大部分JavaFX API已直接移植到Java中。一些API,如布局和媒体,以及许多其他细节,根据JavaFX 1.x版本的用户反馈进行了改进和简化。JavaFX更多地依赖于Web标准,如CSS用于控件样式和ARIA用于辅助功能规范。对于使用其他Web标准的情况也正在审查中。

图形系统

JavaFX图形系统在JavaFX场景图层下方,如图2-1中所示,是一个实现细节。它支持2D和3D场景图。当系统的图形硬件不足以支持硬件加速渲染时,它提供软件渲染。

JavaFX平台上实现了两个图形加速管道:

  • Prism处理渲染作业。它可以在硬件和软件渲染器上运行,包括3D。它负责JavaFX场景的光栅化和渲染。根据使用的设备,可能有以下多个渲染路径:

    • Windows XP和Windows Vista上的DirectX 9

    • Windows 7上的DirectX 11

    • Mac、Linux、嵌入式系统上的OpenGL

    • 当无法进行硬件加速时,使用软件渲染

      当可能时,会使用完全硬件加速的路径,但当不可用时,会使用软件渲染路径,因为软件渲染路径已经分发在所有的Java Runtime Environments (JREs)中。这在处理3D场景时尤为重要。然而,使用硬件渲染路径时性能更好。

  • Quantum Toolkit将Prism和Glass Windowing Toolkit连接在一起,并使它们在堆栈中的JavaFX层中可用。它还管理与渲染和事件处理相关的线程规则。

Glass窗口工具包

Glass窗口工具包,如图2-1中的米色部分所示,是JavaFX图形堆栈中的最底层。它的主要责任是提供本地操作服务,例如管理窗口、定时器和表面。它作为平台相关的层将JavaFX平台连接到本地操作系统。

Glass工具包还负责管理事件队列。与抽象窗口工具包(AWT)不同,后者管理自己的事件队列,Glass工具包使用本地操作系统的事件队列功能来调度线程使用。与AWT不同,Glass工具包在与JavaFX应用程序相同的线程上运行。在AWT中,AWT的本地部分在一个线程上运行,Java级别在另一个线程上运行。这引入了许多问题,其中许多在JavaFX中通过使用单个JavaFX应用程序线程方法得到解决。

线程

系统在任何给定时间运行两个或多个以下线程。

  • JavaFX应用程序线程:这是JavaFX应用程序开发人员使用的主要线程。任何“活动”场景(即作为窗口一部分的场景)必须从此线程访问。场景图可以在后台线程中创建和操作,但是当其根节点附加到场景中的任何活动对象时,必须从JavaFX应用程序线程访问该场景图。这使开发人员能够在后台线程上创建复杂的场景图,同时保持“活动”场景上的动画流畅和快速。JavaFX应用程序线程与Swing和AWT事件分派线程(EDT)是不同的线程,因此在将JavaFX代码嵌入到Swing应用程序中时必须小心。

  • Prism渲染线程:此线程将渲染与事件分派器分开处理。它允许在处理帧N + 1时渲染帧N。这种并发处理的能力是一个很大的优势,特别是在具有多个处理器的现代系统上。Prism渲染线程还可以有多个光栅化线程,帮助卸载需要在渲染中完成的工作。

  • 媒体线程:此线程在后台运行,并通过使用JavaFX应用程序线程将最新的帧同步到场景图中。

脉冲

脉冲是一个事件,用于指示JavaFX场景图与Prism同步元素状态的时间。脉冲最大限制为每秒60帧(fps),并且在场景图上运行动画时触发。即使没有运行动画,当场景图中的某些内容发生变化时,也会触发脉冲。例如,如果更改了按钮的位置,将会触发脉冲。

当脉冲触发时,场景图上的元素状态将与渲染层同步。脉冲使应用程序开发人员能够异步处理事件。这个重要的特性允许系统在脉冲上批量执行事件。

布局和CSS也与脉冲事件相关联。场景图中的多个变化可能导致多次布局或CSS更新,这可能严重影响性能。系统会在每个脉冲中自动执行一次CSS和布局过程,以避免性能下降。应用程序开发人员还可以根据需要手动触发布局过程,以在脉冲之前进行测量。

Glass窗口工具包负责执行脉冲事件。它使用高分辨率的本地定时器进行执行。

2 理解JavaFX架构(8版)

媒体和图像

JavaFX媒体功能通过javafx.scene.media API提供。JavaFX支持视觉和音频媒体。支持MP3、AIFF和WAV音频文件以及FLV视频文件。JavaFX媒体功能由三个独立的组件提供:Media对象表示媒体文件,MediaPlayer播放媒体文件,MediaView是显示媒体的节点。

媒体引擎组件在图2-1中以绿色显示,它经过设计以提供性能和稳定性,并在各个平台上提供一致的行为。更多信息,请阅读将媒体资产整合到JavaFX应用程序中文档。

Web组件

Web组件是一个基于Webkit的JavaFX UI控件,通过其API提供Web浏览器和完整的浏览功能。这个Web引擎组件在图2-1中以橙色显示,它基于Webkit,Webkit是一个支持HTML5、CSS、JavaScript、DOM和SVG的开源Web浏览器引擎。它使开发人员能够在他们的Java应用程序中实现以下功能:

  • 从本地或远程URL渲染HTML内容

  • 支持历史记录并提供后退和前进导航

  • 重新加载内容

  • 对Web组件应用效果

  • 编辑HTML内容

  • 执行JavaScript命令

  • 处理事件

这个嵌入式浏览器组件由以下类组成:

  • WebEngine提供基本的网页浏览能力。

  • WebView封装了一个WebEngine对象,将HTML内容整合到应用程序的场景中,并提供应用效果和变换的字段和方法。它是Node类的扩展。

此外,Java调用可以通过JavaScript进行控制,反之亦然,以允许开发人员充分利用两个环境。有关JavaFX嵌入式浏览器的更详细概述,请参阅将HTML内容添加到JavaFX应用程序文档。

2 理解JavaFX架构(Release 8)

CSS

JavaFX层叠样式表(CSS)提供了在不更改任何应用程序源代码的情况下,对JavaFX应用程序的用户界面应用自定义样式的能力。CSS可以应用于JavaFX场景图中的任何节点,并且以异步方式应用于节点。JavaFX CSS样式也可以在运行时轻松地分配给场景,从而使应用程序的外观可以动态变化。

图2-2演示了将两种不同的CSS样式应用于相同的UI控件集的情况。

图2-2 CSS样式表示例

图2-2的描述
"图2-2 CSS样式表示例"的描述

JavaFX CSS基于W3C CSS 2.1规范,还添加了一些来自版本3的当前工作的内容。JavaFX CSS支持和扩展的设计使得JavaFX CSS样式表可以被任何符合规范的CSS解析器清晰地解析,即使它不支持JavaFX扩展。这使得可以将JavaFX和其他目的(如HTML页面)的CSS样式混合到单个样式表中。所有JavaFX属性名称都以“-fx-”作为供应商扩展的前缀,包括那些可能与标准HTML CSS兼容的属性名称,因为一些JavaFX值具有稍微不同的语义。

有关JavaFX CSS的更详细信息,请参阅使用CSS为JavaFX应用程序设置外观文档。

UI控件

通过使用场景图中的节点构建,JavaFX API提供了可用的JavaFX UI控件。它们可以充分利用JavaFX平台的视觉丰富功能,并且在不同平台上可移植。JavaFX CSS允许对UI控件进行主题和皮肤设置。

图2-3显示了当前支持的一些UI控件。这些控件位于javafx.scene.control包中。

图2-3 JavaFX UI控件示例

图2-3的描述
"图2-3 JavaFX UI控件示例"的描述

有关所有可用的JavaFX UI控件的更详细信息,请参阅使用JavaFX UI控件javafx.scene.control包的API文档

布局

布局容器或面板可用于在JavaFX应用程序的场景图中灵活和动态地排列UI控件。JavaFX布局API包括以下容器类,可以自动化常见的布局模型:

  • BorderPane类将其内容节点布局在顶部、底部、右侧、左侧或中心区域。

  • HBox类将其内容节点水平排列在一行中。

  • VBox类将其内容节点垂直排列在一列中。

  • StackPane类将其内容节点放置在一个从后到前的单一堆栈中。

  • GridPane类允许开发人员创建一个灵活的行列网格,用于布局内容节点。

  • FlowPane类将其内容节点在水平或垂直方向上以“流”方式排列,根据指定的宽度(水平)或高度(垂直)边界进行换行。

  • TilePane类将其内容节点放置在统一大小的布局单元或瓷砖中

  • AnchorPane类允许开发人员创建锚节点,将其锚定到布局的顶部、底部、左侧或中心。

为了实现所需的布局结构,可以在JavaFX应用程序中嵌套不同的容器。

要了解有关如何使用布局的更多信息,请参阅在JavaFX中使用布局文章。有关JavaFX布局API的更多信息,请参阅javafx.scene.layout包的API文档。

2D和3D变换

JavaFX场景图中的每个节点都可以使用以下javafx.scene.tranform类在x-y坐标上进行变换:

  • translate - 将节点从一个位置移动到另一个位置,相对于其初始位置的x、y、z平面。

  • scale - 调整节点在x、y、z平面上的大小,根据缩放因子的大小,可以使节点看起来更大或更小。

  • shear - 旋转一个轴,使x轴和y轴不再垂直。节点的坐标将按指定的乘数进行偏移。

  • rotate - 围绕场景的指定中心点旋转节点。

  • affine - 执行从2D/3D坐标到其他2D/3D坐标的线性映射,同时保持线的“直线”和“平行”属性。应该使用TranslateScaleRotateShear变换类来代替直接使用此类。

要了解有关使用变换的更多信息,请参阅在JavaFX中应用变换文档。有关javafx.scene.transform API类的更多信息,请参阅API文档

视觉效果

在JavaFX场景图中开发丰富的客户端界面涉及使用视觉效果或效果来实时增强JavaFX应用程序的外观。JavaFX效果主要基于图像像素,因此它们将场景图中的节点集合渲染为图像,并对其应用指定的效果。

JavaFX中可用的一些视觉效果包括以下类的使用:

  • Drop Shadow - 在应用效果的内容后面渲染给定内容的阴影。

  • Reflection - 在实际内容下方渲染内容的反射版本。

  • Lighting - 模拟光源照射在给定内容上,并可以使平面对象具有更逼真的三维外观。

有关如何使用一些可用的视觉效果的示例,请参见创建视觉效果文档。有关所有可用视觉效果类的更多信息,请参见javafx.scene.effect包的API文档

关闭窗口

目录

JavaFX: JavaFX入门

展开 折叠