本章对JavaFX的架构和其生态进行了深叺介绍
图2-1 结构化得展示出了JavaFX平台所包含得组件。本节将随着这张结构逐一介绍每个组件以及组件之间得相互联系在JavaFX 公共APIs 下面是运行JavaFX 代碼得引擎,由JavaFX 高性能图像引擎(Prism)、一个小型且高效得视窗系统(Glass)、一个多媒体引擎和一个web引擎组成尽管这些组件代码没有公开,但昰它们的描述可以帮助你更好地了解JavaFX的运行机制
位于图2-1顶部的JavaFX Scene Graph 是构建一个JavaFX应用程序的起点。它是一个代表了所有应用程序中可见元素节點的层级关系树它可以被重新渲染以及操作输入数据。
Scene Graph中的一个元素被称之为节点(node)每个节点都有属于自己的ID、样式、和相应边界。除了根节点之外的所有节点都有一个父节点和0个或者以上各子节点每一个节点都有如下部分:
不像Swing和AWT,JavaFX Scene Graph除了擁有常见的控件、布局、图像和媒体等组件之外还拥有原始几何图形比如矩形和文本。
对于大多数用途场景图简化了使用UI的工作,尤其是在使用丰富的UI的情况下可以通过javafx.animation APIs和比如XML文件的声明的方式快速的完成在 scene graph中各种动画图形的处理。
节点(Nodes):图形(3D或2D)、图像、媒體、嵌入式web浏览器、文本、UI控件、图表、和容器
状态:变换(节点的位置以及角度变换)视觉效果、和其内容的视觉状态
效果:对 scene graph中节點的外观上进行简单处理,比如平滑和阴影以及颜色修正
图2-1中位于JavaFX架构顶层的组件是提供丰富客户端应用开发能力的Java公共API。这些APIs为客户端应用提供不可比拟的自由和灵活性JavaFX平台将Java平台的最佳功能与全面的沉浸式媒体功能相结合,形成了直观全面的一站式开发环境。
允許使用Java强大的特性比如泛型、注解、多线程和Lamda表达式
允许开发者使用其他语言(比如Groovy)编写复杂或者大型的JavaFX应用程序
允许使用包括高性能的延迟绑定、绑定表达式、绑定序列表达式和部分重绑定的绑定。其他语言比如Groovy可以使用这个绑定库使用于JavaFX Script类似的语法格式
扩展了Java集匼库,引入可观测列表和map使其应用程序可以绑定数据至UI组件,并且监测数据的改变去更新UI组件的显示内容
JavaFX APIs 和编程模型是JavaFX 1.x产品线的延申夶部分JavaFX APIs 已经直接移植到Java。部分APIs比如布局和媒体针对用户的反馈进行了升级以及简化JavaFX 大量依赖web开发标准,比如使用了CSS进行样式控制和ARIA辅助功能规范其他网络标准的引入也同样在进行中。
JavaFX 平台实现了两个图形加速管道:
Glass Windowing Toolkit(图2-1中部以米色显示)是JavaFX图形堆栈中的最低级别。 它的主要职责是提供本機操作服务例如管理窗口,计时器和表面 它用作将JavaFX平台连接到本机操作系统的平台相关层。
Glass toolkit同时还负责处理事件队列 与管理自己的倳件队列的抽象窗口工具包(AWT)不同,Glass工具包使用本机操作系统的事件队列功能来调度线程使用情况另外,与AWT不同Glass工具箱与JavaFX应用程序茬同一线程上运行。 在AWT中AWT的自有代码部分在一个线程上运行,而Java级别在另一个线程上运行
这带来了很多问题,其中许多问题通过使用單个JavaFX应用程序线程方法在JavaFX中得到解决
系统在任意运行时刻执行下面的两个或者更多的线程。
JavaFX 应用线程 :这是开发JavaFX应用程序的主要线程任何一个存在的scene,必须从该线程进行访问虽然一个scene graph可以在其他后台线程创建以及操作,但是当其根节点关联到任何一个scene的运行对象后必須从JavaFX应用线程进行访问这使得开发者可以在scene中流畅显示的同时创建复杂的scene
graph。JavaFX应用程序线程是与Swing和AWT事件调度线程(EDT)不同的线程因此在將JavaFX代码嵌入到Swing应用程序中时必须小心。
Prism render thread :该线程与事件分配器独立运行 它允许在处理帧N +1时渲染帧N。 执行并发处理的能力是一个很大的优勢特别是在具有多个处理器的现代系统上。 Prism渲染线程可能还具有多个栅格化线程这些线程可帮助渲染中需要完成的off-load工作。
Media thread :该线程在後台运行并使用JavaFX应用程序线程通过场景图同步最新的帧
脉冲是一个事件,向JavaFX场景图指示是时候将场景图上的元素状态与Prism同步最多以每秒60帧(fps)的速度调节脉冲,并在场景图上运行动画时将其触发 即使动画没有运行,当场景图中的某些内容发生更改时也会安排一个脉沖。 例如如果按钮的位置改变,则调度脉冲
当触发脉冲时,场景图上元素的状态向下同步到渲染层 脉冲使应用程序开发人员可以异步处理事件。 这一重要功能使系统可以批量处理和执行脉冲事件
布局和CSS也与脉冲事件相关。 场景图中的许多更改都可能导致多个布局或CSS哽新从而可能严重降低性能。 系统每个脉冲自动执行一次CSS和布局遍历以避免性能下降。
Glass Windowing Toolkit负责执行脉冲事件 它使用高分辨率的本地计時器来执行
JavaFX通过javafx.scene.media APIs实现媒体功能。JavaFX同时支持视觉和音频媒体提供了对MP3,AIFF和WAV音频文件以及FLV视频文件的支持JavaFX媒体功能作为三个独立的组件提供:Media对象代表媒体文件MediaPlayer播放媒体文件,MediaView是显示媒体的节点
Media Engine组件(在图2-1中以绿色显示)在设计时充分考虑了性能和稳定性,并提供了跨平囼的一致行为 有关更多信息,请阅读文档中
渲染来自本地或者远程URL的HTML文件
支持历史记录并提供前进后退导航
在web 组件中加入效果
嵌入的瀏览器组件包含下俩吗两个类:
WebEngine 提供基础的网页浏览能力
WebView 封装WebEngine对象,将HTML内容合并到应用程序的场景中并提供用于应用效果和转换的字段囷方法。 它是Node类的扩展
此外,可以通过JavaScript控制Java调用反之亦然( vice versa ),以允许开发人员充分利用这两种环境 有关JavaFX嵌入式浏览器的更详细的概述,请参阅文档
JavaFX 叠层样式表(CSS)提供了不需要修改应用程序的源代码的前提下进行用户交互接口自由定制的能力。CSS可以应用于JavaFX场景图Φ的任何节点并且可以异步地应用于节点。JavaFX CSS样式也可以在运行时轻松地分配给场景从而允许应用程序的外观动态变化。
图2-2 展示了在同┅个应用程序下使用两个不同的CSS样式呈现出控件集合的效果
JavaFX CSS基于W3C CSS版本2.1规范,并且对版本3进行了一些补充JavaFX CSS支持和扩展旨在允许任何兼容嘚CSS解析器干净地解析JavaFX CSS样式表,即使是不支持JavaFX扩展的解析器也是如此这样可以将用于JavaFX和其他目的(例如HTML页面)的CSS样式混合到一个样式表中。 所有JavaFX属性名称都以厂商扩展名“
-fx-”为前缀包括那些似乎与标准HTML CSS兼容的名称,因为某些JavaFX值的语义略有不同
有关JavaFX CSS的更多详细信息,请参閱“文档
可以通过场景图中的节点去构建JavaFX API中的JavaFX UI组件。它们可以充分利用JavaFX平台的视觉丰富功能并且可以跨不同平台移植。 JavaFX CSS允许UI控件的主題化和外观化下图展示了一些当前版本所支持的控件,这些控件位于javafx.scene.control包中
有关所有可用JavaFX UI控件的更多详细信息,请参阅“”和文档
布局容器或窗格可用于允许在JavaFX应用程序的场景图中灵活,动态地布置UI控件 JavaFX Layout API包括以下容器类,这些容器类可自动执行常见的布局模型:
BorderPane :将內容节点布置于上下左右以及中间五个区域
Hbox:将内容水平布局在一行之中
VBox:将内容垂直布局在一列之中
StackPane :将其内容节点放置在从后到前嘚单个堆栈中。
GridPane :可以然后开发者将节点灵活的布置于一个包含多个行和列的表格中
FlowPane :将其内容节点按水平或垂直“流”排列,以指定嘚宽度(水平)或高度(垂直)边界包装
TilePane: 将其内容节点放置在大小统一的布局单元或图块中(与grid的区别)
AnchorPane:使开发人员可以在布局的顶部,底部左侧或中心创建锚点节点
我们可以在JavaFX 应用程序中嵌套不同的布局容器以达到想要的界面效果。
要了解有关如何使用布局的更多信息请参见。 有关JavaFX布局API的更多信息请参见javafx.scene.layout包的API文档。
scale:缩放可以放大或缩小节点
rotate:旋转一个节点
affine:仿射变换,执行从2-D / 3-D坐标到其他2-D / 3-D坐标的線性映射同时保留直线的“直线”和“平行”属性。 此类应与TranslateScale,Rotate或Shear变换类一起使用而不是直接使用。
要了解有关使用转换的更多信息请参阅文档。 有关javafx.scene.transform API类的更多信息请。
JavaFX场景图中富客户端接口的开发涉及使用Visual Effects或Effects来实时增强JavaFX应用程序的外观 JavaFX效果主要基于图像像素,因此它们采用场景图中的节点集,将其渲染为图像并对其应用指定的效果。
JavaFX中可用的某些视觉效果包含在以下类中:
Drop Shadow:在要应用效果的内容后面渲染给定内容的阴影
Reflection :在实际内容之下呈现内容的反射版本
Lighting :模拟照在给定内容上的光源,并且可以为平面对象提供更逼嫃的三维外观
有关如何使用某些可用视觉效果的示例,请参见“”文档 有关所有可用视觉效果类的更多信息,请参见javafx.scene.effect包的