SpringBoot对于Java程序员来说可以是一个福音,它让程序员在开发的时候,大大简化了各种spring的xml配置。

那么在JavaFX项目使用SpringBoot会是怎么样的体验呢?

这次使用“GuyHub”的开源项目springboot-javafx-support体验一下SpringBoot + JavaFX开发。
JavaFX桌面应用开发系列文章传送门 ~
  1. JavaFX桌面应用开发-HelloWorld
  2. JavaFX布局神器-SceneBuilder
  3. JavaFX让UI更美观-CSS样式
  4. JavaFX桌面应用-为什么应用老是“未响应”
  5. JavaFX桌面应用-MVC模式开发,“真香”
  6. JavaFX桌面应用-loading界面
  7. JavaFX桌面应用-表格用法
  8. JavaFX桌面应用-视频转码工具
  9. JavaFX桌面应用-SpringBoot + JavaFX (本文)

引入依赖

采用最新的SpringBoot版本和springboot-javafx-support版本

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>de.roskenet</groupId>
<artifactId>springboot-javafx-support</artifactId>
<version>2.1.6</version>
</dependency>

极速体验

springboot-javafx-support 主要两个关键的组件:

  1. AbstractJavaFxApplicationSupport (启动类继承它)
  2. AbstractFxmlView (视图类继承它)

视图排版

这里使用FXML布局界面。

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.112"
xmlns:fx="http://javafx.com/fxml/1">
<children>
<Label layoutX="99.0" layoutY="109.0" prefHeight="34.0" prefWidth="394.0" text="Hello World!">
<font>
<Font size="26.0" />
</font>
</Label>
</children>
</Pane>

视图类

视图类很简单,只需要继承AbstractFxmlView并添加@FXMLView注解即可。

@FXMLView
public class HelloworldView extends AbstractFxmlView {
}

启动类

启动类跟SpringBoot的启动类差不多,不过需要需要继承AbstractJavaFxApplicationSupport,然后将主视图类传进去。

@SpringBootApplication
public class App extends AbstractJavaFxApplicationSupport { public static void main(String[] args) {
launch(App.class, HelloworldView.class, args);
}
}

这样一个超级简单的SpringBoot + JavaFX就完成了。

springboot-javafx-support默认带了启动界面,这在SpringBoot项目中是非常有必要的,因为SpringBoot项目通常来说启动都要一定的时间。

程序启动完成后,启动界面会自动关闭,显示程序主界面。

框架分析

springboot-javafx-support 这个框架及其简单,所有源码总共才9个类,下面介绍一下这9个类。

  1. AbstractFxmlView 视频抽象基类,负责加载FXML界面,然后通过getView()来获取视图。
  2. AbstractJavaFxApplicationSupport 启动抽象基类,继承了JavaFX的Application,在init方法启动SpringBoot程序,并提供了一些声明周期的回调。
  3. Constant 一些配置key的常量,可以通过application.yml来配置JavaFX程序的标题,宽高、样式等。
  4. FXMLController Controller层的注解,使用这个注解的类将注册成为Spring Bean。
  5. FXMLView FXML视图层的注解,同样的,使用这个注解的类也将注册成为Spring Bean。
  6. GUIState 枚举单例,存储一样JavaFX的对象,如果Stage,Scene,HostService,系统托盘等。
  7. PropertyReaderHelper 配置读取工具。
  8. ResourceBundleControl 支持自定编码的ResouceBundle,针对I18N很有用。
  9. SplashScreen 默认启动动画界面。

一些约定

springboot-javafx-support中有一些约定:

  1. 资源(fxml\css\i18n)放在resources中,目录结构跟View类的包目录结构一致。
  2. 将View类名的"View"去掉后所有字母转为小写作为资源的名称。

当然这些约定可以通过@FXMLView注解中的属性来调整。

public @interface FXMLView {
String value() default "";
String[] css() default {};
String bundle() default "";
String encoding() default "ISO-8859-1";
String title() default "";
String stageStyle() default "UTILITY";
}

Spring展现

到目前为止还看不到springboot-javafx-support中spring的影子,接下来通过一个例子来展现一下springboot-javafx-support的魅力。

这里通过两个视图切换作为例子:

调整之前的视图,新增调整到Hi视图的按钮,并将视图跟ViewController绑定,处理toHi事件。

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.112"
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="example.ViewController">
<children>
<Label layoutX="99.0" layoutY="109.0" prefHeight="34.0" prefWidth="394.0" text="Hello World!">
<font>
<Font size="26.0" />
</font>
</Label>
<Button layoutX="99.0" layoutY="169.0" prefHeight="34.0" prefWidth="150.0" text="Hi" onAction="#toHi"/>
</children>
</Pane>

同样的Hi视图也绑定到ViewController中

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.112"
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="example.ViewController">
<children>
<Label layoutX="99.0" layoutY="109.0" prefHeight="34.0" prefWidth="394.0" text="Hi IT青年!">
<font>
<Font size="26.0" />
</font>
</Label>
<Button layoutX="99.0" layoutY="169.0" prefHeight="34.0" prefWidth="150.0" text="Hello" onAction="#toHello"/>
</children>
</Pane>

这里跟之前写过的一些案例有点不同的时候,fxml和controller的关系是多对一的关系。(之前的案例都是一对一的关系)。

springboot-javafx-support组件的关系图如下:

ViewController中,将Helloworld和Hi视图注入进来,单点击按钮的时候进行视图切换。

ViewController源码如下:

@FXMLController
public class ViewController { @Autowired
private HelloworldView helloworldView;
@Autowired
private HiView hiView;
@Autowired
private FooService fooService; public void toHi() {
System.out.println(fooService.service());
App.getScene().setRoot(hiView.getView());
} public void toHello() {
App.getScene().setRoot(helloworldView.getView());
}
}

这里的@Autowired是Spring的注解,由于@FXMLController主键的Controller是Spring的bean,所以这里完全可以像spring开发一样编写代码。

如:@Autowired private FooService fooService;

FoorService是一个简单的接口

public interface FooService {
String service();
}

其实现:

@Service
public class FooServiceImpl implements FooService {
@Override
public String service() {
return "Foo Service";
}
}

启动界面

springboot-javafx-support提供了默认的启动界面,当然也开放了自定义界面的入库。

自定义启动节目只需要继承SplashScreen并重写相关方法即可,这里简单的替换启动图案:

public class CustomLoadingView extends SplashScreen {
@Override
public String getImagePath() {
return "/images/logo.png";
}
}

在启动类中指定启动界面:

@SpringBootApplication
public class App extends AbstractJavaFxApplicationSupport {
public static void main(String[] args) {
launch(App.class, HelloworldView.class, new CustomLoadingView(), args);
}
}

这样启动界面就不再是之前的样子

更多案例

springboot-javafx-support提供了一些案例,包括:

  1. 如何加载css
  2. 如何使用i18n
  3. 如何打开视图

等等。

有兴趣的话可以看看,GitHub传送门

https://github.com/roskenet/spring-javafx-examples

另外附送 springboot-javafx-support 的GitHub地址

https://github.com/roskenet/springboot-javafx-support

=========================================================

关注 公众号 “HiIT青年” 发送 “javafx-springboot” 获取源码。



关注公众号,阅读更多文章。

JavaFX桌面应用-SpringBoot + JavaFX的更多相关文章

  1. JavaFX桌面应用-构建程序框架

    看到JavaFX应用很多人都会说JavaFX应用太丑了,确实JavaFX比起Qt.MFC.Delphi这些界面确实丑了一点,但也不是没有可以美化的空间. 跟网页一样,单纯HTML不加任何CSS的时候也 ...

  2. JavaFX桌面应用-MVC模式开发,“真香”

    使用mvc模块开发JavaFX桌面应用在JavaFX系列文章第一篇 JavaFX桌面应用开发-HelloWorld 已经提到过,这里单独整理使用mvc模式开发开发的流程. ~ JavaFX桌面应用开发 ...

  3. GraalVM最佳实践,使用Java开发CLI、Desktop(JavaFX)、Web(SpringBoot)项目,并使用native-image技术把Java代码静态编译为独立可执行文件(本机映像)

    原创文章,转载请注明出处! 源码地址: Gitee Gtihub 介绍 GraalVM最佳实践,使用Java开发CLI.Desktop(JavaFX).Web(SpringBoot)项目,并使用nat ...

  4. JavaFX桌面应用开发-HelloWorld

    JavaFX是一个强大的图形和多媒体处理工具包集合,它允许开发者来设计.创建.测试.调试和部署富客户端程序,并且和Java一样跨平台. JavaFX比Swing好用很多,它允许开发使用FXML来设计和 ...

  5. JavaFX桌面应用-为什么应用老是“未响应”

    日常使用软件的过程中,偶尔会遇到软件突然卡住,再点击几次就变成"未响应"的情况. 在JavaFX应用中同样也会出现这种情况,在开发过程中应该尽量避免这种情况的出现. >> ...

  6. JavaFX桌面应用开发系列文章

    ~ JavaFX桌面应用开发系列文章汇总篇 ~ JavaFX桌面应用开发-HelloWorld JavaFX布局神器-SceneBuilder JavaFX让UI更美观-CSS样式 JavaFX桌面应 ...

  7. JavaFX桌面应用-视频转码工具(支持爱奇艺qsv转mp4)

    最近由于需要将在爱奇艺下载的视频(qsv)转化了mp4,用JavaFX开发一个视频转码工具,算是JavaFX开发的第一个应用吧. 支持qsv转码mp4,理论上支持各种格式,仅测试了flv,qsv格式. ...

  8. JavaFX桌面应用-loading界面

    上次使用JavaFX开发了一个视频转码工具,当用户点击"启动"按钮开始转码的时候,会禁用启动按钮,防止多次启动转码. 这种处理方式对用户来说可能并是很友好,其实可以在启动转码的时弹 ...

  9. JavaFX桌面应用-版本升级

    好久没有写博客,2021年就以 "JavaFX桌面应用-版本升级" 开篇吧,记录一下JavaFX应用版本升级的开发流程. 桌面应用升级的方案应该很多,这里只是自己想到的方案. 1. ...

随机推荐

  1. It还是高薪行业不?—软件测试

    It还是高薪行业不?—软件测试 谁都希望拿高薪,但是并不是所有人.所有地方都能的:甚者培训出来还不能就业的大有人在,也不是所有人都适合培训后就业(年龄.学历.专业.期望就业地点.不同行业转行还是有很大 ...

  2. MAVEN无法下载com.oracle:jdbc14:jar解决办法

    原文链接:https://www.cnblogs.com/gqzdev/p/11742999.html 第一步,下载ojdbc14jar包: 链接:ojdbc14jar 提取码: 2m59 第二步,下 ...

  3. Filebeat日志收集简单使用

    1.简略介绍 轻量型日志采集器,用于转发和汇总日志与文件. 官网: https://www.elastic.co/cn/beats/filebeat 2.本文实现的功能 3.事先必备: 至少一台Kaf ...

  4. PHP Cookie是什么

    PHP Cookie cookie 常用于识别用户. Cookie 是什么? cookie 常用于识别用户.cookie 是一种服务器留在用户计算机上的小文件.每当同一台计算机通过浏览器请求页面时,这 ...

  5. 关于c/c++指针,指针的指针

    伪军迷祝:建军节快乐! 当调用一个函数时,实际上入参使用的都是副本(除非是引用),指针也不例外.举个例子如: void func(int a, int * p); 当调用func时无论是a还是p其实传 ...

  6. 【mysql数据库优化】

    sql优化:1.MYSQL逻辑分层 :连接层 服务层 引擎层 存储层 InnoDB(默认) :事务优先 (适合高并发操作:行锁) MyISAM :性能优先 (表锁) 2.sql的执行顺序:SQL : ...

  7. 学习java 线程池-1: ThreadPoolExecutor

    1. Executor 该接口内只有一个接口方法 :该方法的目的就是执行指定的 Runnable (但会不会执行,或者会不会立马执行,则不一定.因为要取决于整个线程池的状态) Executor 中文的 ...

  8. 20、FlyWeight 享元模式

    池化的思想 1.Flyweight享元模式 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用.由于享元模式要求能够共享的对象必 ...

  9. Java三大特性与实战

    三大特性: 封装,集成,多态 编程思想 类和对象: 方法的重载 this关键字 static关键字 静态代码块 package import Object 抽象类 接口 lambda表达式 字符串St ...

  10. java验证输入是否为三阶幻方

    问题描述: 小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行.每一列和每一条对角线的和都是相同的. 三阶幻方又 ...