前言
JavaFX是一个强大的图形和多媒体处理工具包集合,它允许开发者来设计、创建、测试、调试和部署富客户端程序,并且和Java一样跨平台。
组成结构
- javaFX基础(javaFX系列之launcher启动器:两种启动javaFX的方式及launch(args[])参数设置和获取)
- 窗体(javaFX2.0窗体(Stage)分析及使用)
- 场景(javaFX2.0场景(Scene)分析及使用)
- 布局
- UI组件
- 2D/3D图形系统(windows vista以下使用directx 9.0,windows7使用directx 11.0,macos/linux使用opengl)
- 多媒体(音视频)(javaFX系列之media:最简单的javaFX视频播放器实现)
- 视觉特效
- web组件(javaFX系列之web组件:最简单的javaFX浏览器实现)
- css层叠样式表(支持css2.0和少量css3.0
- 其他
- JavaFX线程结构分析
节点结构
讲到场景Scene,就不得不讲javaFX的节点结构,JavaFX把所有控件都设计为节点Node
窗体(Stage)------设置------>一个场景(Scene)-----添加------>多个节点(Node,可以是UI组件,图片,音视频,web浏览器等等)
简单场景功能实现
public class SceneDemo extends Application {
String title="eguid简单场景Scene功能演示,转载请注明出处和作者名,blog 。 eguid . cc原创技术文章";
@Override
public void init() throws Exception {
Console.log("窗体打开之前的一些初始化,当前线程:"+Thread.currentThread().getName());
super.init();
}@Override
public void start(Stage primaryStage) throws Exception {
Console.log("打开窗体,当前线程:"+Thread.currentThread().getName());
primaryStage.setTitle(title); // 设置标题Group root=new Group();
//场景,场景必须在窗体Stage初始化后才能创建,只有在javaFX launcher线程的 init()方法和javaFX Application线程中才能进行创建,其他线程会抛出异常。
Scene scene=new Scene(root, 2000,2000,Color.WHITE);//场景不能在javaFX线程外创建
primaryStage.setScene(scene);//设置场景
primaryStage.show();//显示窗体
}@Override
public void stop() throws Exception {
Console.log("关闭窗体,当前线程:"+Thread.currentThread().getName());
super.stop();
}public static void main(String[] args) {
Console.log("启动程序");
Application.launch(args);
}}
多场景切换
窗体(Stage)中虽然只可以设置一个场景,但是我们可以通过设置场景的方式来做到多个场景之间切换。比如我们以一个简单聊天软件为例,我们需要两个场景就可以模拟出大概的样子:
- 登录场景(用来输入用户名密码进行登录)
- 主场景(用户登录后进入的主操作场景,查看好友列表之类的)
刚打开窗体显示的是”登录场景“,一顿操作猛如虎之后点击登录按钮进入了“主场景”,如何实现这个场景切换的功能。
注意:虽然我们可以通过多个窗体的方式来实现类似场景切换的功能,但是创建和销毁窗体的资源消耗明显比创建场景消耗要大得非常多,第一篇文章中已经分析了JavaFX的窗体都包含三个线程(启动器线程,JavaFX渲染线程和JavaFX Application线程),而我们的多场景切换实际上是共享一个窗体,这样做资源消耗更少。
多场景切换功能实现
public class SceneChangeSample extends Application {
String title="eguid简单场景Scene功能演示,转载请注明出处和作者名,blog 。 eguid . cc原创技术文章";@Override
public void init() throws Exception {
Console.log("窗体打开之前的一些初始化,当前线程:" + Thread.currentThread().getName());
super.init();
}@Override
public void start(Stage primaryStage) throws Exception {
Console.log("打开窗体,当前线程:" + Thread.currentThread().getName());
primaryStage.setTitle(title); // 设置标题Group root = new Group();
// 场景,场景必须在窗体Stage初始化后才能创建,只有在javaFX launcher线程的 init()方法和javaFX
// Application线程中才能进行创建,其他线程会抛出异常。Scene scene = new Scene(root, 2000, 2000, Color.WHITE);// 场景不能在javaFX线程外创建
// 创建第二个场景
Group second = new Group();
Scene secondScene = new Scene(second, 800, 600, Color.BLACK);EventHandler<Event> eventHandler = new EventHandler<Event>() {
@Override
public void handle(Event event) {
EventType<? extends Event> type = event.getEventType();
String name = type.getName();
Console.log("事件名称:" + name);// KeyEvent.KEY_PRESSED
switch (name) {
case "MOUSE_CLICKED":
// 按键后触发播放动画效果,播放后完全不影响应用工作线程,说明完全可行
// 可以在事件中处理逻辑计算
Console.log("鼠标点击");
break;
case "KEY_PRESSED":
// 任意键盘按键触发场景切换,切换到第二个场景
primaryStage.setScene(secondScene);
break;
}
event.consume();
}
};
scene.addEventHandler(Event.ANY, eventHandler);// 绑定事件primaryStage.setScene(scene);// 设置第一个场景为显示场景
primaryStage.show();// 显示窗体
}@Override
public void stop() throws Exception {
Console.log("关闭窗体,当前线程:" + Thread.currentThread().getName());
super.stop();
}public static void main(String[] args) {
Console.log("启动程序");
Application.launch(args);
}}