这几天鼓捣bilibili的直播,想做一个桌面弹窗,方便查看直播消息,开始用Python和PyQt5,后来觉得Python手实在太生,写出来的代码惨不忍睹,不如就用ava写了,找工作也用得上。Java写GUI一向饱受诟病,看了半天也没啥很好的方案,推荐最多的就是JavaFX了。中文资料比较缺乏,只能慢慢摸索了,做到哪里就跟着写到哪里吧,这篇就总结下JavaFx学到的东西。
概述
JavaFX是一个强大的图形和多媒体处理工具包集合,和Java一样是跨平台的,在Java8里面已经内置。
JavaFX8新的特性(不知道啥意思跟着抄下来装逼就对了):
- JavaFX应用程序的默认主题是新设计的Modena主题。详见“关键特性”一节中的Modena主题部分。
- 已经加入了对HTML5的支持。详见“向JavaFX应用程序中添加HTML内容”相关章节。
- 新添加的SwingNode类改进了与Swing的互操作性。参考“在JavaFX应用程序中嵌入Swing内容”相关章节。
- 新的内置UI控件,DatePicker和TableView,已经可用。参考《使用JavaFX UI控件》一文来获得更多信息。
- 3D图形库被改进了,增加了一些新的API类。参考“关键特性”一节中的3D图形特性部分和“开始使用JavaFX 3D图形”章节来获得更多信息。
- print包现在是可用的,并且提供了公开的JavaFX打印API
- 加入了富本文支持
- 对Hi-DPI显示的支持已经变得可用了
- CSS样式类变成了公开API
- 引入了调度服务类
JavaFX架构
先放一个现成的架构图:
Scene 场景图
Scene在顶层部分,是构建JavaFX应用的入口,这是一个层级结构的节点树,表示了所有用户界面的视觉元素,可以处理输入,可以被渲染。
场景图中的元素被称为一个节点(Node),每个节点有一个ID,样式类和一个包围盒(bounding volime),除了根节点,其他都有一个父节点,零个或者多个子节点。除此之外还有如下特性:
- 效果(Effects),比如模糊和阴影
- 不透明度(Opacity)
- 变换(Transforms)
- 事件处理器(Event handlers,例如鼠标、键盘和输入法)
- 应用相关的状态(Application-specific state)
图形系统
JavaFX图形系统(Graphics System)是架构图中蓝色部分,是在JavaFX场景图层之下的实现细节。当系统中的图形硬件无法支持硬件加速渲染时,它将提供软件渲染技术。
在JavaFX平台中实现了两套图形加速流水线:
- Prism用于处理渲染工作。它可以在硬件和软件渲染器之上工作,包括3D。它负责将JavaFX场景进行光栅化和渲染。下面的各种渲染方式都有可能被用到:
- 在Windows XP和Vista上的DirectX 9
- 在Windows 7上的DirectX 11
- Mac、Linux、嵌入式设备上的OpenGL
- 当硬件加速技术不支持时使用软件渲染,如果可能将会优先使用硬件加速,但是如果硬件加速不可用则会使用软件渲染,软件渲染技术已经内置于JRE之中。这点在展示3D场景时尤其重要。当然,使用硬件加速时性能将会更好。
- Quantum Toolkit 将Prism和Glass Windowing ToolKit绑在一起,使得它们可以被其上层的JavaFX层使用。它也负责管理与渲染有关的事件处理的线程规则。
用法
Hello World
最简单的一个例子:
1 | import javafx.application.Application; |
2 | import javafx.scene.Group; |
3 | import javafx.scene.Scene; |
4 | import javafx.scene.paint.Color; |
5 | import javafx.stage.Stage; |
6 | |
7 | public class Main extends Application { |
8 | |
9 | |
10 | public void start(Stage stage) { |
11 | Group root = new Group(); |
12 | Scene scene = new Scene(root, 500, 500, Color.BLACK); |
13 | stage.setTitle("JavaFX Scene Graph Demo"); |
14 | stage.setScene(scene); |
15 | stage.show(); |
16 | } |
17 | |
18 | public static void main(String[] args) { |
19 | launch(args); |
20 | } |
21 | } |