javaFX2.0窗体(Stage)分析及使用

前言

JavaFX是一个强大的图形和多媒体处理工具包集合,它允许开发者来设计、创建、测试、调试和部署富客户端程序,并且和Java一样跨平台。

组成结构

窗体功能

javaFX通过Stage提供了窗体的一些控制功能,提供了诸如设置窗体大小、全屏、全屏快捷键设置、聚焦、保持最上方,显示,隐藏等等常见的窗体功能。

而Stage只有在JavaFX Application线程中才能够得到并且进行控制,查看了javaFX的源码,发现JavaFX对窗体控制进行了线程检查,只允许JavaFX Application线程进行控制,其他线程是无法对javaFX的窗体进行控制和调用。

javaFX线程结构分析请参考第一篇文章:javaFX2.0线程结构分析

窗体演示代码

真的开始使用JavaFX才会发现JavaFX的窗体设计很不灵活,限制极多,比如节点只能在javaFX线程中才能进行创建,其他线程不允许操作窗体Stage等等。当然这里有设计者自己的考量,比如官方文档注释说明这是为了保证javafx线程对于窗体的独占性,防止像之前awt那样出现线程问题。但是再博主使用了一段时间来看,这种解决一个问题又出现了更多的问题的解决方案,显然并不太合适,不仅大大的增加了其他线程对于窗体控制的复杂度,还带来了更加复杂的代码结构,无疑这是得不偿失的,希望后面的版本会进一步优化。

public class StageDemo extends Application {

double minWidth=800,minHeight=600;

static Stage stage;//窗体,想要操作该窗体的api,必须再javaFX Application线程中执行,其他线程执行会抛出异常。

public static Scene scene;//场景,场景必须在窗体Stage初始化后才能创建,只有在javaFX launcher线程的 init()方法和javaFX Application线程中才能进行创建,其他线程会抛出异常。

String title="eguid的窗体Stage功能演示,转载请注明出处和作者名,blog 。 eguid . cc原创技术文章";

    @Override
    public void init() throws Exception {
        Console.log("窗体打开之前的一些初始化,当前线程:"+Thread.currentThread().getName());

        Group root=new Group();      

        scene=new Scene(root, 2000,2000,Color.WHITE);//场景不能在
        super.init();
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Console.log("打开窗体,当前线程:"+Thread.currentThread().getName());
        stage=primaryStage;
        primaryStage.setScene(scene);
        Console.log(scene);
        // 舞台/窗体
        primaryStage.setTitle(title);
        // 设置窗体最大最小范围,防止窗口过小和过大。
        primaryStage.setMinWidth(minWidth);
        primaryStage.setMinHeight(minHeight);

        //获取当前屏幕最大分辨率,自行实现的工具
        int maxWidth = ScreenUtil.getWidth(), maxHeight = ScreenUtil.getHeight();
        primaryStage.setMaxWidth(maxWidth);//设置最大宽度
        primaryStage.setMaxHeight(maxHeight);//设置最大高度
        Console.log("最大分辨率:" + maxWidth + "," + maxHeight);
        //设置退出全屏快捷键
        primaryStage.setFullScreenExitKeyCombination(new KeyCombination() {
            @Override
            public boolean match(KeyEvent event) {
                String name=event.getCode().getName();
                Console.log("按键名称:"+name);
                return super.match(event);
            }
        });
        
        primaryStage.setFullScreen(true);//全屏
        primaryStage.setResizable(true);//允许自由调整窗体大小
        primaryStage.setFocused(true);//聚焦
        primaryStage.setAlwaysOnTop(true);//保持窗体再最上方
        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);
    }

}

猜你喜欢

转载自blog.csdn.net/eguid/article/details/94322363