本章对JavaFX的架构和其生态进行了深入介绍。
图2-1 结构化得展示出了JavaFX平台所包含得组件。本节将随着这张结构逐一介绍每个组件以及组件之间得相互联系。在JavaFX 公共APIs 下面是运行JavaFX 代码得引擎,由JavaFX 高性能图像引擎(Prism)、一个小型且高效得视窗系统(Glass)、一个多媒体引擎和一个web引擎组成。尽管这些组件代码没有公开,但是它们的描述可以帮助你更好地了解JavaFX的运行机制。

  • Scene Graph
  • 针对JavaFX 的Java 公共API
  • 图形系统
  • Glass 视窗工具箱
  • 媒体和图像
  • 网页组件
  • CSS
  • UI控件
  • 布局
  • 2D和3D转换
  • 视觉效果
    图2-1 JavaFX 组织架构图

Scene Graph
位于图2-1顶部的JavaFX Scene Graph 是构建一个JavaFX应用程序的起点。它是一个代表了所有应用程序中可见元素节点的层级关系树。它可以被重新渲染以及操作输入数据。

Scene Graph中的一个元素被称之为节点(node)。每个节点都有属于自己的ID、样式、和相应边界。除了根节点之外的所有节点都有一个父节点和0个或者以上各子节点。每一个节点都有如下部分:

  • 效果,不如平滑和阴影
  • 不透明度(opacity)
  • 变换
  • 事件处理(鼠标 键盘等)
  • 特定于应用程序的状态

不像Swing和AWT,JavaFX Scene Graph除了拥有常见的控件、布局、图像和媒体等组件之外还拥有原始几何图形,比如矩形和文本。

对于大多数用途,场景图简化了使用UI的工作,尤其是在使用丰富的UI的情况下。可以通过javafx.animation APIs和比如XML文件的声明的方式快速的完成在 scene graph中各种动画图形的处理。

javafx.scene API 可以创建和声明多种内容,如下:

  • 节点(Nodes):图形(3D或2D)、图像、媒体、嵌入式web浏览器、文本、UI控件、图表、和容器
  • 状态:变换(节点的位置以及角度变换),视觉效果、和其内容的视觉状态
  • 效果:对 scene graph中节点的外观上进行简单处理,比如平滑和阴影以及颜色修正。

** 针对 JavaFX 特性的Java 公共APIs**
图2-1中位于JavaFX架构顶层的组件是提供丰富客户端应用开发能力的Java公共API。这些APIs为客户端应用提供不可比拟的自由和灵活性,JavaFX平台将Java平台的最佳功能与全面的沉浸式媒体功能相结合,形成了直观,全面的一站式开发环境。

  • 允许使用Java强大的特性比如泛型、注解、多线程和Lamda表达式。
  • 更加方便的使用其他基于JVM动态语言的比如 Groovy 和JavaScript的web开发者使用JavaFX。
  • 允许开发者使用其他语言(比如Groovy)编写复杂或者大型的JavaFX应用程序
  • 允许使用包括高性能的延迟绑定、绑定表达式、绑定序列表达式和部分重绑定的绑定。其他语言比如Groovy可以使用这个绑定库使用于JavaFX Script类似的语法格式。
  • 扩展了Java集合库,引入可观测列表和map,使其应用程序可以绑定数据至UI组件,并且监测数据的改变去更新UI组件的显示内容

JavaFX APIs 和编程模型是JavaFX 1.x产品线的延申。大部分JavaFX APIs 已经直接移植到Java。部分APIs比如布局和媒体针对用户的反馈进行了升级以及简化。JavaFX 大量依赖web开发标准,比如使用了CSS进行样式控制和ARIA辅助功能规范。其他网络标准的引入也同样在进行中。

图形系统

图2-1中显示的JavaFX 图形系统实现于JavaFX scene graph之下。它同时支持2D和3D的JavaFX scene graph。当硬件系统缺乏相应支持的加速硬件时提供了软件渲染方式。

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

  • Prism 流程渲染作业。它可以同时使用硬件和软件渲染器,包括3D渲染功能。它扶着JavaFX 场景的占栅格化和渲染。根据所使用的设备,提供了下列集中渲染路径:
  • 在winXP 和win vista 上使用DirectX9
  • win7上使用Direct11
  • 在Mac、Linux、嵌入式设备中使用OpenGl
  • 当硬件加速器不支持的时候使用软件渲染。
    当允许的时候可以使用全部的硬件加速路径,但是也可以在硬件加速不被支持的时候使用软件渲染功能,因为该功能已经在JREs中部署。在处理3D场景时这一点尤其重要,但是使用硬件渲染路径时性能会更好。
  • Quantum Toolkit将Prism和 Glass Windowing Toolkit结合然后提供给上层的JavaFX使用。它还管理与渲染与事件处理相关的线程规则。

Glass Windowing Toolkit
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应用程序线程通过场景图同步最新的帧

Pulse
脉冲是一个事件,向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中以绿色显示)在设计时充分考虑了性能和稳定性,并提供了跨平台的一致行为。 有关更多信息,请阅读将媒体资产合并到JavaFX Applications文档中。

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

  • 渲染来自本地或者远程URL的HTML文件
  • 支持历史记录并提供前进后退导航
  • 重载内容
  • 在web 组件中加入效果
  • 编辑HTML内容
  • 执行JS脚本命令
  • 事件管理

嵌入的浏览器组件包含下俩吗两个类:

  • WebEngine 提供基础的网页浏览能力
  • WebView封装WebEngine对象,将HTML内容合并到应用程序的场景中,并提供用于应用效果和转换的字段和方法。 它是Node类的扩展。

此外,可以通过JavaScript控制Java调用,反之亦然( vice versa ),以允许开发人员充分利用这两种环境。 有关JavaFX嵌入式浏览器的更详细的概述

CSS
JavaFX 叠层样式表(CSS)提供了不需要修改应用程序的源代码的前提下进行用户交互接口自由定制的能力。CSS可以应用于JavaFX场景图中的任何节点,并且可以异步地应用于节点。JavaFX CSS样式也可以在运行时轻松地分配给场景,从而允许应用程序的外观动态变化。

图2-2 展示了在同一个应用程序下使用两个不同的CSS样式呈现出控件集合的效果。

图2-2 CSS样式表示例

java 图表插件 javafx图表框架_java 图表插件


JavaFX CSS基于W3C CSS版本2.1规范,并且对版本3进行了一些补充。JavaFX CSS支持和扩展旨在允许任何兼容的CSS解析器干净地解析JavaFX CSS样式表,即使是不支持JavaFX扩展的解析器也是如此。这样可以将用于JavaFX和其他目的(例如HTML页面)的CSS样式混合到一个样式表中。 所有JavaFX属性名称都以厂商扩展名“ -fx-”为前缀,包括那些似乎与标准HTML CSS兼容的名称,因为某些JavaFX值的语义略有不同。

UI 控件

可以通过场景图中的节点去构建JavaFX API中的JavaFX UI组件。它们可以充分利用JavaFX平台的视觉丰富功能,并且可以跨不同平台移植。 JavaFX CSS允许UI控件的主题化和外观化。下图展示了一些当前版本所支持的控件,这些控件位于javafx.scene.control包中。

java 图表插件 javafx图表框架_java 图表插件_02


布局
布局容器或窗格可用于允许在JavaFX应用程序的场景图中灵活,动态地布置UI控件。 JavaFX Layout API包括以下容器类,这些容器类可自动执行常见的布局模型:

  • BorderPane :将内容节点布置于上下左右以及中间五个区域。
  • Hbox:将内容水平布局在一行之中
  • VBox:将内容垂直布局在一列之中
  • StackPane :将其内容节点放置在从后到前的单个堆栈中。
  • GridPane :可以然后开发者将节点灵活的布置于一个包含多个行和列的表格中。
  • FlowPane :将其内容节点按水平或垂直“流”排列,以指定的宽度(水平)或高度(垂直)边界包装。
  • TilePane: 将其内容节点放置在大小统一的布局单元或图块中(与grid的区别)
  • AnchorPane:使开发人员可以在布局的顶部,底部,左侧或中心创建锚点节点

我们可以在JavaFX 应用程序中嵌套不同的布局容器以达到想要的界面效果。

2-D 和3-D Transformations
JavaFX scene graph 中的每一个节点都可以通过javafx.scene.tranform 类在x-y坐标上进行如下变换:

  • translate :平移,在xyz坐标上平移节点。
  • scale:缩放,可以放大或缩小节点
  • rotate:旋转一个节点
  • affine:仿射变换,执行从2-D / 3-D坐标到其他2-D / 3-D坐标的线性映射,同时保留直线的“直线”和“平行”属性。 此类应与Translate,Scale,Rotate或Shear变换类一起使用,而不是直接使用。

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

JavaFX中可用的某些视觉效果包含在以下类中:

  • Drop Shadow:在要应用效果的内容后面渲染给定内容的阴影
  • Reflection :在实际内容之下呈现内容的反射版本。
  • Lighting :模拟照在给定内容上的光源,并且可以为平面对象提供更逼真的三维外观。