Solon v2.7.5

分享:Solon + JavaFX 开发桌面应用

</> markdown

此分享,由社区成员(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 开发。