概述
JavaFX是一个基于Java的开源框架,用于Java平台的图形用户界面(GUI)开发技术领域,是Java swing的继承者
JavaFX还可以使用任何支持Java虚拟机(JVM)的脚本语言编写,如Kotlin丶Groovy和Scala
JavaFX提供了两种构建用户界面(UI)的方法:
使用Java代码
丶使用FXML
JavaFX支持在应用中嵌入web页面
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和Lolajava [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和SceneThe 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()
方法终止应用