JavaFX桌面應用-SpringBoot + JavaFX


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” 獲取源碼。(如果沒有收到回復,可能是你之前取消過關注。)

HiIT青年
關注公眾號,閱讀更多文章。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM