5.7 JavaFX
JavaFX是利用Java开发桌面应用的发展方向。前面提到,JavaFX将与Java平台本身进行更加深度的集成,JavaFX把Java平台变成了一个开发富客户端应用(Rich Client Platform, RCP)的良好平台。使用JavaFX可以开发出功能强大和交互性强的桌面应用。JavaFX应用也可以通过类似Java Applet的方式运行在浏览器中。本节将对JavaFX 2.0进行比较具体的介绍。
5.7.1 场景图
JavaFX应用程序的编写方式与AWT及Swing有很大不同。JavaFX用了更加形象的方式来描述用户界面及其变化。JavaFX的这种方式类似于戏剧表演,戏剧表演在一个舞台上进行,一部剧可由多幕组成,每一幕的内容各不相同,完成当前一幕的表演之后,会切换到下一幕。在JavaFX中,javafx.stage.Stage类的作用类似于戏剧表演时的舞台,是一个顶层容器,用来包含其他的界面组件。而javafx.scene.Scene类的作用类似于戏剧表演中的不同幕,表示程序运行时的不同场景。通过Stage类的setScene方法可以切换显示不同的场景。每个场景中可以包含以树形结构组织的多个节点,称之为场景图(scene graph)。JavaFX把用户界面上的基本图形元素和用户界面组件两类元素进行了统一,统称为节点,用javafx.scene.Node类来表示。矩形、椭圆、按钮或表格,都是用户界面上的节点,可以用相似的方式来处理。
下面通过一个简单的示例来说明JavaFX程序的基本结构。代码清单5-16中的JavaFX程序实现在界面上显示一个按钮和标签。当单击按钮时,标签上的文本会变为“Hello World!”。JavaFX程序的主Java类需要继承自javafx.application.Application类。Application类负责管理JavaFX程序的生命周期。在Application类中定义了与生命周期相关的方法。在Application类的对象被创建出来之后,会调用init方法进行JavaFX程序的初始化工作;接着start方法会被调用。运行时环境负责创建一个Stage类的对象,并作为start方法调用时的实际参数。在start方法中创建界面所需的Scene类的对象,并设置到Stage类的对象上,使该Scene类的对象作为程序的当前界面场景。Scene类的对象包含了界面所需的其他组件。程序继续运行,直到程序的最后一个窗口被关闭或程序调用javafx.application.Platform类的exit方法显式地结束运行。最后调用stop方法来进行适当的资源释放和清理工作。程序只需要覆写Application类中的对应方法即可。在主Java类的main方法中调用Application类的静态方法launch来启动程序运行。
代码清单5-16 JavaFX应用程序的基本结构
public class JavaFXHelloworld extends Application{
public static void main(String[]args){
launch(args);
}
public void start(Stage primaryStage){
primaryStage.setTitle("JavaFX Sample");
Button button=new Button();
button.setText("Button");
final Label label=new Label();
button.setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent event){
label.setText("Hello World!");
}
});
BorderPane pane=new BorderPane();
pane.setTop(button);
pane.setBottom(label);
Group root=new Group(pane);
primaryStage.setScene(new Scene(root,400,300));
primaryStage.show();
}
}
JavaFX也使用了与AWT和Swing相似的线程处理方式。在JavaFX程序启动时,运行时环境创建一个新的线程来执行Application类的对象的start方法。创建Stage和Scene类的对象的操作,以及对界面上节点的修改,都需要在这个线程中进行。这个线程被称为JavaFX的应用线程。通过Platform类的isFxApplicationThread方法可以判断当前线程是否为JavaFX的应用线程。在JavaFX程序中,同样可以使用工作线程在后台执行任务。调用Platform类的runLater方法可以在应用线程中进行界面的更新操作。这个方法的作用类似于前面提到的EventQueue和SwingUtilities类中的invokeLater方法。
在场景图中可以使用的节点都是Node类的对象。节点大致可分为三类:第一类是常见的用户界面控件,继承自javafx.scene.control.Control类;第二类是几何图形形状,继承自javafx.scene.shape.Shape类;第三类是与多媒体相关的类,包括显示图片的javafx.scene.image.ImageView类以及播放音频和视频文件的javafx.scene.media.MediaView类。JavaFX还提供了对图表绘制的支持,包括javafx.scene.chart.Chart类及其子类。
JavaFX 2. 0中的图形渲染引擎Prism可以借助底层操作系统上的DirectX和OpenGL支持来进行界面渲染,并利用硬件平台提供的加速能力来提升界面绘制时的性能。这种方式要优于Swing在绘制界面时使用的基于Java 2D的软件渲染方式。因此JavaFX程序的性能相对于Swing有大幅度的提升。