社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
为什么要在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方法,返回创建好的界面就可以)
// 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的事件机制触发重启。
几个javaFX项目,欢迎指点。
https://github.com/SW-Fantastic/Readergithub.com SW-Fantastic/skyboxgithub.com如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!