0%

JavaFX简单入门

这几天鼓捣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
   @Override
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
}

参考资料

JavaFX中文资料