1 JavaFX架构和框架
JavaFX2.0是基于Java技术构建的富客户端平台,使应用开发者易于创建和部署跨平台的富互联网应用(Rich Internet Application RIAs)。
图-1描述了JavaFX2.0的架构性组件构成。这部分将描述图表构成的每个组件以及这些组成部分如何交互。JavaFX公开APIs依存于真正运行JavaFX代码的应用引擎。它的构成子组件包括新的高性能图形引擎(代号Prism)、新的体积小且高效的视窗体系(代号Glass)、媒体引擎、web引擎。尽管这些组件没有公开暴露,但关于这些的描述能有助于你更好地理解JavaFX应用是如何运作的。
图-1 JavaFX2.0架构图
1.1 场景图
JavaFX场景图(图-1顶层部分)是构建JavaFX应用的起始点。它是应用图形接口所有可视元素节点的层级节点树,并能处理输入及渲染。
场景图中的单个元素称为节点。每个节点有一个标识ID、样式类及绑定量。每个节点有单一的父类以及零到多个子节点,节点也可有如下功能:
Ø 效果化,诸如模糊、阴影化处理;
Ø 不透明;
Ø 变换;
Ø 事件处理,诸如鼠标、键盘以及输入方法等;
Ø 特定应用状态处理。
不像在Swing和AWT(AbstractWindow Toolkit)中,JavaFX场景图也有基本图形,例如矩形、文本框,还有控件、布局容器、图片以及媒介处理等。对于大多数使用,场景图简化了UIs的工作,特别是在使用富UIs时。各种各样的动画能更快的完成,并且声明式方法(如基于XML)也能很好的显效运行。
这个javafx.scene的API允许创建和规范好几种类型的内容,例如:
节点:图形(2D和3D)、图片、媒体、嵌入式页面浏览器、文本框、UI控件、图表、分组以及容器;
状态:变换(节点位置和方向)、可视化效果以及其它可视化状态内容;
动画:随时间变化的场景图对象属性特征;
效果:改变场景图节点面貌的简单效果对象,诸如模糊、阴影、颜色调整等。
关于场景图这部更多信息,可以查看“基于JavaFX场景图工作”部分文档描述。
1.2 JavaFX特征API
JavaFX2.0平台包括一套完整的公共APIs,如图-1最顶层所示。这些APIs为构建富客户端(RIAs)提供了空前的自由和灵活性。JavaFX结合了Java平台最好的功能,以全面的、引人入胜的媒体功能形成直观、一站式开发环境。这些针对JavaFX特征的Java APIs有:
Ø 允许使用强大的java特性,如泛型、标注和多线程。
Ø 对于Web开发者来讲,使用JavaFX进行开发,相比其它流行动态语言,如JRuby、Groovy和JavaScript,更为容易些。
Ø 允许Java开发者使用其它系统语言,如Groovy,来编写大型的或复杂的JavaFX应用。
Ø 允许使用类似于JavaFX脚本语言绑定。这种绑定包括高性能“懒”绑定、绑定表达式、范围序列表达式、局部绑定再赋值等。可选语言(如Groovy)也能引入使用类似JavaFX脚本的绑定语法。
Ø 扩展Java集合库,包括可观察Lists和Maps。这样允许应用连接用户界面和数据模型,观察数据模型的变化,并一致性的更新相应UI控件。
JavaFX2.0 API和编程模型是JavaFX1.x产品线的延续,大多数的JavaFX APIs已经导入到Java中。有些APIs,如布局和媒体,以及其它许多相关细节,基于发行版JavaFX1.x用户反馈,已经进行了改进并简化。JavaFX2.0依赖于更多的web标准,如样式控制CSS、访问性规范ARIA。其它附加web标准也在审查中。
1.3 图形系统
JavaFX图形系统(如图-1蓝色部分)是一个在JavaFX场景图层下的细节实现,支持2D和3D场景图。该图形系统在系统图形硬件加速渲染不足时,可实现软件渲染。JavaFX2.0平台实现的两个图形加速管道为:
1、Prism处理渲染工作。它能运行在硬件和软件渲染器上,包括3-D。负责光栅化和渲染JavaFX场景。下列多个渲染途径可基于设备使用:
² Windows XP和Windows Vista上的DirectX 9;
² Windows 7上的DirectX11 ;
² Mac、linux及嵌入设备上的OpenGL;
² Java2D(不能硬件加速时)。可能时完全硬件加速可用,但当不可用时,Java2D渲染途径可用(因为Java2D渲染器发行于所有JREs中)。当处理3-D场景时,这是特别重要的。当然使用硬件渲染器时性能更好些。
2、QuantumToolkit 把Prism和GlassWindowing Toolkit连接在一起,并使它们在堆栈上对JavaFX层可用。它也管理着与事件处理相对与渲染有关的线程规则。
1.4 视窗工具Glass
如图-1中部位置所示,Glass视窗包是JavaFX2.0图形堆栈最底层框架。它的主要职责是提供本地化操作服务,诸如管理窗口、定时器以及外观等。作为平台相关层,它负责连接JavaFX平台和本地操作系统。
Glass工具包也负责管理事件队列。它不像AWT自我管理事件队列,Glass使用本地操作系统的事件队列功能来安排线程使用。也不像AWT,Glass作为JavaFX应用运行在相同的线程上。在AWT中,本地一半的AWT事件运行在一个线程上,而Java层的运行在另一个线程上。这许多问题,在JavaFX中通过使用单应用线程方法得到了解决。
1.5 线程
在任何给的时间内,系统运行两个或更多个如下线程。
Ø JavaF应用线程:这是JavaFX应用开发者使用的主要线程。在任何“实时”场景中,作为视窗场景一部分,必须通过此线程进入访问。但是,场景也能从后台线程中创建,这使得开发者能够基于后台线程创建复杂场景,以便能在实时性动画场景中保持画质的滑顺和快速。JavaFX应用线程是与Swing和AWT的时事件发线程(EDT)不同的,因此必须小心在Swing应用中嵌入JavaFX代码。
Ø Prism渲染线程:此线程基于事件分发来分别处理渲染工作。这使得在N+1帧被处理时,N帧能被渲染。这种能力对执行并发处理是非常有利的,特别是现代多处理器系统。Prism渲染器线程也可有多个栅格化线程,这有助于需要在渲染时完成的过负荷的工作。
Ø 媒体线程:这个线程运行在后台,使用JavaFX应用线程通过场景图同步最新帧。
1.6 Pulse(脉冲事件)
一次Pulse是一个事件,它指示JavaFX布景用Prism适时同步场景中元素状态。一次Pulse最大控制在每秒(fps)60帧内,并可由场景图中运行的动画任意时刻触发。即使动画没有运行,当场景图中有什么变化时,一次Pulse也被预定。当一次Pulse触发,场景图中元素状态被向下同步到渲染层。一次Pulse使开发者有方法处理异步事件。这是个重要的特性,使系统能在Pulse上批量处理和执行事件。
布局和CSS也被联系到Pulse事件。场景图中许多改变能引起多布局或CSS更新,这可能会严重降低性能。系统每次Pulse自动执行CSS和布局传递可以避免性能降级。在需要测量前一个Pulse时,应用开发者也能自动触发布局或CSS传递。
Glass视窗包负责执行Pulse事件。它使用高解析度本地时间来做执行。
1.7 媒体和图片
JavaFX媒体处理功能通过包javafx.scene.media包的APIs调用。JavaFX支持可视化和音频媒体,支持的媒体格式有MP3、AIFF、WAV音频文件以及FLV视频文件。JavaFX媒体功能通过三个独立组件实现:媒体对象代表一个媒体文件,媒体播放器播放媒体文件,媒体视图是一个展示媒介的节点。
为提高媒体引擎组件(图-1绿色部分)稳定性能,在2.0中已经完成重新设计了:既提高性能,也提供了跨平台一致性行为表现。
1.8 嵌入浏览器
嵌入浏览器是JavaFX新的用户界面组件,基于APIs它提供一个web查看器和一个完整的浏览功能。如图-1中橘色部分,web引擎组件基于Webkit,它是个一个开源的、支持HTML5、CSS、Javascript、DOM、以及SVG等的web浏览器引擎。这使开发者能够在java应用中实现如下特性:
Ø 从本地或远程URL渲染HTML内容(以html方式浏览内容);
Ø 支持浏览历史,实现回退和前进导航;
Ø 重载内容;
Ø 对web组件应用效果化处理;
Ø 编辑HTML内容;
Ø 执行Javascript命令;
Ø 处理事件。
嵌入浏览器组件有下面相关类构成:
Ø WebEngine:提供基本页面浏览能力;
Ø WebView:封装了一个WebEngine对象,把HTML内容合并到应用场景中,并提供字段和方法应用效果化和转换。这是个Node类的扩展。
更多内容可以查看JavaFX嵌入浏览器相关介绍。
1.9 CSS(层叠样式)
在不需要改变任何源码情况下,CSS为JavaFX应用提供了定制式样风格能力。CSS可应用到场景图中任何节点及异步节点。CSS样式很容易实时应用到场景中,允许应用程序动态改变面貌。图-2演示了同样UI控件在两类CSS中的不同样式:
图-2 CSS样式表示例
JavaFX CSS是基于W3C的CSS2.1版规范,并带有一些3.0版内容。JavaFX的CSS支持和扩展被设计为可被任何兼容的CSS解析器清晰解析,甚至不支持JavaFX扩展的解析器。这可以使JavaFX得CSS和其它目的CSS(如HTML页面)混合为单一式样单。所有javafx属性名带有厂商扩展“-fx-”前缀,包括那些可能是兼容标准的HTML的CSS。因为有些Javafx值有略微不同的语义。
更多JavaFX有关CSS请查阅相关专题: SkinningJavaFX Applications with CSS.
1.10 UI控件
JavaFX可用界面控件(UI Controls)经JavaFX API在场景图中通过使用节点被构建。这些控件能完全利用可视化丰富JavaFX平台特性的的好处,并能轻便夸不同平台。CSS允许UI控件实现不同主题和外观。
图-3展示了当前支持的图形界面控件。新的Java UI控件,像TitlePane或Accordion已经引入到JavaFX2.0的SDK中,这些新组建在javafx.scene.control包中。
图-3 JavaFX UI控件示例
更多界面控件信息,请查阅相关主题介绍: UsingJavaFX UI Controls 和 API documentation。
1.11 布局设计(Layout)
在JavaFX应用场景图中,布局容器或面板用于灵活和动态性布置UI控件位置。布局API包括如下常见的自动化布局模型的容器类:
Ø BorderPane类:把内容节点框设在顶部、底部、右部、左部以及中间区域;
Ø HBox类:在单行内水平放置内容节点;
Ø VBox类:在单列中垂直放置内容节点;
Ø StackPane类:在一个从后到前单栈中放置内容节点;
Ø GridPane类:使开发者创建灵活的行列网格来安置内容节点;
Ø FlowPane类:以水平或垂直“流化”形式放置内容节点,且包装在指定宽(对水平)或高(对垂直)边界内;
Ø TilePane类:以一致尺寸的单元格或标题栏放置内容节点;
Ø AnchorPane类:使开发者可以在布局的顶部、底部、左边、或中部创建锚节点。
为了得到一个理想的布局结构,不同容器可在JavaFX应用中嵌套使用。
需要学习更多布局应用,请查看“Working with Layouts in JavaFX”相关文章。相应的布局API详情,可查看javafx.scene.layout包。
1.12 2D和3D转换
场景图中的每个节点都可使用javafx.scene.tranform中的类基于X-Y坐标进行转变:
Ø Translate:可以相对初始位置,沿着XYZ把节点从一个位置面移到另一个位置面;
Ø Scale:基于放缩因子,在XYZ方向上重设一个节点的大小;
Ø Shear:旋转一轴,使X和Y轴不在垂直,使节点的坐标基于指定的乘数被改变;
Ø Rotate:以指定的的轴点旋转场景中的节点;
Ø Affine:执行从一个2D/3D坐标到另一个2D/3D坐标的线性映射,同时保留“直线”和“并行”的直线特性。这个类应该和Translate
, Scale
, Rotate
, or Shear
转换类一起使用,而不是直接使用。
需要学习更多关于JavaFX的转换内容,查看“ ApplyingTransformations in JavaFX”文档。
1.13 可视化效果
基于JavaFX场景图的富客户界面的开发,主要包括可视化效果的使用或是应用外观效果的实时性强化。JavaFX效果主要是基于像素的图像应用,也就是把场景图中的一套节点作为一个图片渲染,并能对它应用指定的效果处理。
JavaFX中一些有效可视化效果处理类如下:
Ø Drop Shadow(拖放阴影):在应用效果的内容后渲染相应内容的阴影;
Ø Reflection(倒影):在实际内容对象下面渲染相应的倒影;
Ø Lighting(照射):在给定的内容对象上模拟发亮光源,并能形成平面对象,呈现一个真实的、3-D的面貌。
更多效果示例,请参考“ Creating Visual Effects”文档。相应的API可查看javafx.scene.effect包。
1.14 部署
JavaFX应用程序可以三种不同的部署模式部署在桌面或浏览器中:
Ø 单机部署(Standalone):应用程序安装在本地驱动,并可双击相应JAR文件运行。这种模式在用户不需要或没有联机访问时是理想选择。
Ø 浏览器部署(Browser):这种模式中,应用程序被嵌入到页面中,当访问页面时自动启动程序。这通过Javascript可实现和页面交互;
Ø Web Start方式:这种模式需要从网上中心位置应用程序,然后在桌面上运行之。一旦下载完成,用户可双击JNLP来运行相应的应用程序。
更多信息可查看“Deploying JavaFX Applications document”内容。