分享:Solon + JavaFX 开发桌面应用
此分享,由社区成员(linziguan)提供或协助。在容器应用上,提供发散参考
JavaFX 开发时, fxml 可以为 视图(mvc 里的 v),对应的控制类则为控制器(mvc 里的 c)。
1、增加 JavaFX 依赖
java 11 后,需要引入依赖包。添加时,版本号可以与编译的 java 版本号相同
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>11</version>
</dependency>
</dependencies>
2、定义 JavaFX 应用启动组件,并对接 Solon 容器
通过 solon 的生命周期事件,在 bean 扫描完成后,启动 JavaFX Application。启动时,按需加载 fxml 视图文件
- 定义 JavaFX 应用: LicenseApp.java
@Component
public class LicenseApp extends Application implements EventListener<AppBeanLoadEndEvent> {
@Override
public void onEvent(AppBeanLoadEndEvent appBeanLoadEndEvent) throws Throwable {
//新启个线程,免得卡住主线程
new Thread(() -> {
launch(LicenseApp.class);
}).start();
}
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader(ResourceUtil.getResource("javafx/license.fxml"));
loader.setControllerFactory(new ControllerFactoryImpl());
Scene scene = new Scene(loader.load());
primaryStage.setTitle("License UI v1.0");
primaryStage.setScene(scene);
primaryStage.show();
}
}
- 与 Solon 容器对接的关键工厂类:ControllerFactoryImpl.java
JavaFx 对 Controller 的默认加载,是根据类路径 + 反射的方式。但也提供了配置 ControllerFactory 的工厂模式开放给用户自定义 Controller 的加载方式。 为了让 Solon 代为托管 Controller 类,我们可以创建一个 ControllerFactoryImpl 来实现 Callback 接口。如下所示:
public class ControllerFactory implements Callback<Class<?>, Object> {
@Override
public Object call(Class<?> aClass) {
//从 solon 容器获取
return Solon.context().getBeanOrNew(aClass);
}
}
3、现在常规开发即可
- 控制器:LicenseController.java
@Component
public class LicenseController implements Initializable {
@FXML
private TextArea license;
@Inject
private LicenseService licenseService;
@Override
public void initialize(URL location, ResourceBundle resources) {
//测试 service 是否正常
licenseService.hello();
}
}
- 视图: fxml文件(通过 fx:controller 关联 java 控制器)
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<VBox prefHeight="400.0" prefWidth="600.0"
xmlns="http://javafx.com/javafx/8"
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="demo1091.disk.controller.LicenseController">
</VBox>
4、怎么打包?
跟其它 solon 程序一样的方式。具体参考:打包与运行
5、详见示例源码
https://gitee.com/noear/solon-examples/tree/main/1.Solon/demo1091-javafx
//任何 solon 版本都支持 javafx 开发。