javafx已经没多少用了_使用springBoot接管JavaFX - Go语言中文社区

javafx已经没多少用了_使用springBoot接管JavaFX


原因

为什么要在spring的环境中使用JavaFX呢?主要是代码容易乱,如果没有框架的话,当然,其实也不是绝对会乱,不过至少目前没有让他一定不会乱的自信,所以我想在spring的环境下使用JavaFX,而且spring的功能非常方便,像是注入和扫描什么的。

该怎么办呢?我搜到了一个整合javaFX的工程,叫做SpringBootJavaFXSupport,这个工程还是Springboot的,这当然更好了。

<!-- https://mvnrepository.com/artifact/de.roskenet/springboot-javafx-support -->
<dependency>
	<groupId>de.roskenet</groupId>
	<artifactId>springboot-javafx-support</artifactId>
	<version>2.1.6</version>
</dependency>

就是这个,只要在Springboot的工程里面加上它就可以使用javafx了。至于spring的那些功能,反正springBoot支持的这里也都能用。

创建界面

在工程的resource文件夹下创建views文件夹(其实这个文件夹名字不一定叫做views,不过我都是这样写的,本文中放界面文件的文件夹就叫views,至于resource文件夹在哪,用过springboot的应该都知道)。

然后这个views文件夹里面放fxml文件,用sceneBuilder拖拽一个界面,然后保存好考进去就行。

现在我做好了一个界面文件,就叫做MainView.fxml,他在views文件夹中。

为了能够把界面显示出来,我需要一个Java的类和这个fxml对应起来,同时呢,在这个类里面还可以进行一些ui的初始化,如果想做的软件需要皮肤功能,那么界面的初始化放在这个UI的class里面就十分合适。

这样的界面类需要继承AbstractFxmlView类,同时使用FXMLView注解指明fxml文件的位置。(其实不用FXML也可以,但是你要手动在这个界面类里面创建控件什么的,然后覆盖getView方法,返回创建好的界面就可以)

0b02257aaa18dba1ca19c08194800b96.png
resource和views以及里面的fxml
// fxml的位置相对于resource文件夹
@FXMLView("/views/TypeDialog.fxml")
public class TypeDialog extends AbstractFxmlView {

 // 注入的是一个properties对应的class
 @Autowired
 private ApplicationConfig config;

 @PostConstruct
 protected void initUI() throws Exception {
   // 初始化界面,恩,主要是初始化界面的样式,因为我想让他可以换皮肤和主题
   UIUtils.configUI((BorderPane)this.getView(), config);
 }
}

总之,一个UI的类,就像这样基本就ok。

哦,对了,在fxml里面不能有WebView,会报错的,需要WebView的话可以在PostConstruct的方法里面,使用Platform.runLater,在这个方法的回调中创建。

启动应用

有了界面就可以启动Spring环境下的JavaFX了。

首先,main方法所在的class要继承AbstractJavaFxApplicationSupport,然后调用launch启动应用。

@SpringBootApplication
public class FApplication extends AbstractJavaFxApplicationSupport {

   public static void main(String[] args) {
     // 参数分别是Application的主类,主界面的UI类,闪屏对象还有args
     // 不想要自定义闪屏的可以调用另一个不带闪屏对象的launch方法
      launch(FApplication.class, MainView.class,new SplashView(), args);
   } 
}

另外这个 类中也提供 了几个钩子,可以在启动的各个阶段被触发来做一些自己的事情,像是beforeShowSplash什么的,看名字就知道。

闪屏界面

继承SplashScreen类可以一个 闪屏,需要重写他的两个方法。

public class SplashView extends SplashScreen {

    @Override
    public String getImagePath() {
       // 其实这里return什么都没有影响,关键是getParent方法
        return "/images/title.png";
    }

    // 返回闪屏的界面
    @Override
    public Parent getParent() {
        Group gp = new Group();
        // 自己写闪屏然后return          t回去
        return gp;
    }

}

这就有自定义的闪屏界面了,可以放到launch方法作为启动时候的闪屏。

控制器

所以说mvc 结构十分经典嘛,javaFX也在遵循这样的一套设计思路,View就是上面的FXML描述的界面,Controller就是这里说的控制器,至于M嘛,运行在界面的数据,这个就得自己处理了。

在javaFX中我们可以通过FXML注解标注一些组件和方法,让他可以和界面的组件和组件的事件的处理方法相互对应起来,这样这个class就可以用来处理一个界面产生的各类事件,控制界面 各种 组件,这样的class就是Controller。

在这里需要使用FXMLController注解标注这样的控制器,然后呢,在fxml里面指定这个class作为fxml的控制器就行,控制器呢,如果需要在开始的时候初始化一些组件,就可以实现Initializable接口,这个接口的方法可以在界面初始化完毕的时候被触发。

public void initialize(URL location, ResourceBundle resources) {

}

就是这个方法了。

这个里面可以给组件用JavaFX的绑定机制绑定一个Observable的对象,然后在PostConstruct标注的方法改变这些Observable对象从而使视图发生变化。

不要对Controller使用AOP手法,这会导致JavaFX自己的FXML注解失效,无法将FXML文件中指定的控件注入到Controller中。

应用重启

在AbstractJavaFxApplicationSupport里面可以添加这样的方法来让应用重启。

public void relaunch(){
        Platform.runLater(() -> {
            // 关闭窗口
            getStage().close();
            try {
                // 关闭ApplicationContext
                this.stop();
                // 重新初始化
                this.init();
                this.start(new Stage());
            } catch (Exception e) {
                log.error(e);
            }
        });
 }

不能直接退出JavaFX然后再次launch,javafx不允许,不过重启ApplicationContext然后重新载入界面是可以的,这样也能够做到重启的效果。

可以 使用SpringBoot的事件机制触发重启。

填坑

  1. 评论区问题:JavaFX的WebView在java8 212版本,载入web内容后疯狂报错,而我们编码本身没有问题,这个大概率是由于JavaFX的内部bug导致,建议换用JxBrowser(学习版就行,公司用的话还最好正式去买)
  2. 如何让Javafx组件宽度和高度与外部一致:使用binding机制:xxx.prefWidthProperty().bind(container.widthProperty())
  3. 如何打包javafx为exe和Mac的app,开新坑写,比较麻烦不在这里说。
  4. 我应该使用javafx吗?Windows用户为主可以放心用,坑不多,mac为主就算了,mac和Linux在java11以上可以试试,要用springboot的话,可以去下载spring-boot-support的源码然后编译为java11的模块,然后使用,如果你不需要javafx的原生界面,仅仅是web应用加一个外壳,不需要本地服务器那种,建议使用electron,这个是webAPP封装的技术,会用node那么就没有问题,VSCode和Atom编辑器都是他做的,已经有了很好的应用实例。

其他

几个javaFX项目,欢迎指点。

https://github.com/SW-Fantastic/Reader​github.com SW-Fantastic/skybox​github.com
9506e468813a13006e9e8ff59cecbd49.png
SW-Fantastic/note​github.com
9506e468813a13006e9e8ff59cecbd49.png
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_39868592/article/details/110723094
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-15 20:15:13
  • 阅读 ( 785 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢