SpringBoot對於Java程序員來說可以是一個福音,它讓程序員在開發的時候,大大簡化了各種spring的xml配置。
那么在JavaFX項目使用SpringBoot會是怎么樣的體驗呢?
- 這次使用“GuyHub”的開源項目springboot-javafx-support體驗一下SpringBoot + JavaFX開發。
- JavaFX桌面應用開發系列文章傳送門 ~
- JavaFX桌面應用開發-HelloWorld
- JavaFX布局神器-SceneBuilder
- JavaFX讓UI更美觀-CSS樣式
- JavaFX桌面應用-為什么應用老是“未響應”
- JavaFX桌面應用-MVC模式開發,“真香”
- JavaFX桌面應用-loading界面
- JavaFX桌面應用-表格用法
- JavaFX桌面應用-視頻轉碼工具
- 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 主要兩個關鍵的組件:
- AbstractJavaFxApplicationSupport (啟動類繼承它)
- 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個類。
- AbstractFxmlView 視頻抽象基類,負責加載FXML界面,然后通過getView()來獲取視圖。
- AbstractJavaFxApplicationSupport 啟動抽象基類,繼承了JavaFX的Application,在init方法啟動SpringBoot程序,並提供了一些聲明周期的回調。
- Constant 一些配置key的常量,可以通過application.yml來配置JavaFX程序的標題,寬高、樣式等。
- FXMLController Controller層的注解,使用這個注解的類將注冊成為Spring Bean。
- FXMLView FXML視圖層的注解,同樣的,使用這個注解的類也將注冊成為Spring Bean。
- GUIState 枚舉單例,存儲一樣JavaFX的對象,如果Stage,Scene,HostService,系統托盤等。
- PropertyReaderHelper 配置讀取工具。
- ResourceBundleControl 支持自定編碼的ResouceBundle,針對I18N很有用。
- SplashScreen 默認啟動動畫界面。
一些約定
springboot-javafx-support中有一些約定:
- 資源(fxml\css\i18n)放在resources中,目錄結構跟View類的包目錄結構一致。
- 將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提供了一些案例,包括:
- 如何加載css
- 如何使用i18n
- 如何打開視圖
等等。
有興趣的話可以看看,GitHub傳送門
另外附送 springboot-javafx-support 的GitHub地址
=========================================================
關注 公眾號 “HiIT青年” 發送 “javafx-springboot” 獲取源碼。(如果沒有收到回復,可能是你之前取消過關注。)
關注公眾號,閱讀更多文章。