JavaFX是一个强大的图形和多媒体处理工具包集合,它允许开发者来设计、创建、测试、调试和部署富客户端程序,并且和Java一样跨平台。
讲到场景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
eventHandler = new EventHandler () {
@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);
}}