JavaFX-初识


概述

  1. JavaFX是一个基于Java的开源框架,用于Java平台的图形用户界面(GUI)开发技术领域,是Java swing的继承者

  2. JavaFX还可以使用任何支持Java虚拟机(JVM)的脚本语言编写,如Kotlin丶Groovy和Scala

  3. JavaFX提供了两种构建用户界面(UI)的方法: 使用Java代码使用FXML

  4. JavaFX支持在应用中嵌入web页面

  5. JavaFX提供了一些动画和特效,可以直接拿来使用

使用流程(使用java9+模块化构建)

1. maven引入sdk
            <dependency>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-controls</artifactId>
                <version>18.0.1</version>
            </dependency>
2. 模块化: 创建module-info.java
//maven项目的java目录下
module helloFx {
    //引入模块
    requires javafx.controls;
    requires javafx.graphics;

    //开放当前模块给javafx.graphics
    opens cn.com.hello to javafx.graphics;
}
3. 创建启动类: 继承Application类并重写其start方法
//继承Application重写其start方法
public class HelloFx extends Application {
    public static void main(String[] args) {
        launch(args);//运行
    }

    //重写start方法
    @Override
    public void start(Stage stage) throws Exception {
        //创建场景
        Scene scene = new Scene(new Label("Hello JavaFX"),400,300);
        stage.setTitle("HelloFx");
        stage.setScene(scene);//场景加入舞台
        stage.show();//显示
    }
}
4. 增加功能
public class HelloFx extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }
    @Override
    public void start(Stage stage) throws Exception {
        stage.setTitle("hello");
        VBox root = new VBox();

        Label nameLbl = new Label("Enter your name");
        TextField nameFld = new TextField();
        Label msg = new Label();
        msg.setStyle("-fx-text-fill: blue");

        //创建按钮
        Button sayHelloBtn = new Button("Say Hello");
        Button exitBtn = new Button("Exit");
        sayHelloBtn.setOnAction(e -> {
            String name = nameFld.getText();
            if(name.trim().length() > 0){
                msg.setText("Hello " + name);
            }
            else msg.setText("Hello there");
        });
        //添加退出按钮事件
        exitBtn.setOnAction(e -> Platform.exit());

        root.setSpacing(5);
        root.getChildren().addAll(new Text("Hello JavaFx"),
                nameLbl,nameFld,msg,sayHelloBtn,exitBtn
                );
        Scene scene = new Scene(root,400,300);
        stage.setScene(scene);
        stage.show();
    }
}

向JavaFX应用传入参数

  • 可以在通过命令行启动应用时传入参数
  • 接收: 通过Application类内部的静态内部类Parameters接收参数,支持三种类型的参数
    • Named parameters: 命名参数
    • Unnamed parameters: 未命名参数
    • Raw parameters (a combination of named and unnamed parameters): 组合参数(包含以上两种)
  • 使用: 通过Parameters类提供的三个方法获取以上三种类型参数使用
    • Map<String, String> getNamed()
    • List<String> getUnnamed()
    • List<String> getRaw()
  • Application类的getParameters()返回参数类对象的引用,可以在init()及其之后执行的代码中通过此方法获取参数类对象的引用,不能再构造函数之中获取,因为构造函数执行在init()方法之前
  • 命令行传入参数例子
    • java [options] com.jdojo.stage.FXParamApp Anna Lola : 传入unnamed参数(同时为raw参数): Anna和Lola
    • java [options] com.jdojo.stage.FXParamApp \ Anna Lola --width=200 --height=100 :传入named参数(同时为raw参数)

启动JavaFX应用

  • 每个JavaFX应用都继承自Application类,在该类中有一个静态的launch()方法专门用于启动应用,它有两个重载方法
    • static void launch(Class appClass, String... args) : 传入启动类+命令行参数,则通过该类启动
    • static void launch(String... args) : 不传入启动类+命令行参数,则通过检测其调用者是否继承Application类,如果是则,将调用者类作为启动类,否则就抛出异常

JavaFX应用的生命周期

  • JavaFX在运行时会创建一些线程在不同阶段执行不同的任务
  • 有两个线程用于调用Application类生命周期相关方法
    • JavaFX-Launcher
    • JavaFX Application Thread
  • Application类的launch()方法创建这些线程,然后这些线程在运行时会按照顺序调用生命周期相关方法
    • The no-args constructor: 无参构造方法
    • The init() method: init()方法,默认时空的,可以重写此方法在初始化时自定义操作不允许创建Stage和Scene
    • The start() method: start()方法,抽象方法,必须重写
    • The stop() method: stop()方法,默认为空实现,有必要重写,实现停止逻辑

终止JavaFX应用

  • 显式终止: 可以在start()方法之后显式调用Platform.exit()方法终止应用,此后会先调用stop()方法,然后应用线程终止,此时,如果只有守护线程运行则JVM退出,如果在构造函数或者init方法中调用则不一定会调用stop方法
  • 隐式终止: 当JavaFX应用的最后一个窗口被关闭时会隐式终止,可以通过Platform类的静态方法setImplicitExit(boolean implicitExit)设置更改此行为(false=关闭此行为,默认为true=开启此行为),此行为打开(true)时,在终止应用之前会调用stop方法
  • 终止JavaFX应用并不总是终止JVM,当所有正在运行的非守护线程都终止时,JVM才终止
  • 如果隐式终止被关闭,那必须显示调用Platform.exit()方法终止应用

文章作者: Bryson
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bryson !
评论
 上一篇
JavaFX-属性和绑定 JavaFX-属性和绑定
概述 Java中的基本数据类型和对象不是可观察的(observable),即不支持监听属性的失效和变化,同时也支持数据绑定 JavaFX中对Java的数据类型和对象进行了封装,使用JavaFX提供的属性,则支持监听属性的失效和变化,同时还
2022-06-10
下一篇 
ES6 ~ ES11新特性 ES6 ~ ES11新特性
变量声明 let: 块级作用域(即花括号范围内)丶不存在变量提升丶不允许重复声明丶不影响作用域链 const: 块级作用域丶常量(不能改变变量引用,引用对象内部可修改)丶需赋初值丶一般用大写 解构赋值 允许按照一定模式从数组和对象中提取值
2022-04-22
  目录