最近在用 JavaFx 開發窗體程序,而且之後打算把全部的窗體軟件切換到 JavaFx 上面,而且還想用springboot
的__各類好處,集成了springboot
就能夠愉快的用各類服務了。因此就有了這個博客。。。
我原本想本身寫一個javafx-spring-boot-starter
的,其原理也是很簡單地,利用springboot
的aware
就能夠了。可是發現德國這哥們已經寫了一個,就變懶了。哎,沒辦法,我真的是太懶了。
本次的代碼Github 地址: https://github.com/spartajet/...
javafx
的springboot
支持的庫,官方是沒有的,開源有一大堆。我採用的是springboot-javafx-support
地址是:springboot-javafx-support .這個庫文檔比較全,比較詳細,文檔地址:Spring Boot and JavaFx8 .css
用springboot
必須用maven
,不然那簡直是災難。最重要的是打包工具。我用的是JavaFX Maven Plugin
地址:JavaFX Maven Pluginhtml
maven 主要配置依賴庫和插件,具體以下:java
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>${spring.boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>${spring.boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> <version>${spring.boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>${spring.boot.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>de.roskenet</groupId> <artifactId>springboot-javafx-support</artifactId> <version>${springboot-javafx-support.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.zenjava</groupId> <artifactId>javafx-maven-plugin</artifactId> <configuration> <mainClass>com.spartajet.fxboot.demo.MainController</mainClass> <vendor>Spartajet</vendor> </configuration> </plugin> </plugins> </build>
其中,比較重要的是:<mainClass>com.spartajet.fxboot.demo.MainController</mainClass>
這個是打包的時候的 main 類。<vendor>Spartajet</vendor>
是組織名稱。git
能夠用 SceneBuilder
工具建立 FXML 文件,我仍是建議本身寫 FXML,剛開始可能不習慣,慢慢習慣就行了。可是,我牆裂建議佈局和樣式分開,fxml 只管佈局,css 只管樣式。github
<BorderPane id="mainBorderPane" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.spartajet.fxboot.demo.controller.MainStageController" stylesheets="/css/MainStage.css"> </BorderPane>
每個 fxml 佈局文件對應一個 controller,要在 fx:controller
裏面設置。web
/** * @description * @create 2017-05-20 下午1:55 * @email spartajet.guo@gmail.com */ @FXMLController public class MainStageController implements Initializable { /** * Called to initialize a controller after its root element has been * completely processed. * * @param location The location used to resolve relative paths for the root object, or * <tt>null</tt> if the location is not known. * @param resources The resources used to localize the root object, or <tt>null</tt> if */ public void initialize(URL location, ResourceBundle resources) { } }
實現Initializable
接口,加上@FXMLController
註解,其實很簡單的。看看@FXMLController
的源碼:spring
@Component @Retention(RetentionPolicy.RUNTIME) public @interface FXMLController { }
這個是比較特殊的,在普通的 javafx 裏面沒有這個東西,可是按照 MVC 的角度來說,業務和試圖分離,仍是頗有必要的。windows
@FXMLView(value = "/view/MainStage.fxml") public class MainStageView extends AbstractFxmlView { }
添加的是註解@FXMLView
,源碼以下:springboot
@Component @Retention(RetentionPolicy.RUNTIME) public @interface FXMLView { String value() default ""; String[] css() default {}; String bundle() default ""; }
從這裏也能看到,能夠在這裏注入 css 樣式文件以及 bundle 文件。仍是比較方便的,我是在 fxml 裏面注入的 css 文件,都是能夠的。
其中還繼承了 AbstractFxmlView
的抽象類,方法比較少,最重要的是getView
方法,返回的是Node
對象。而後就能夠隨意的用這個視圖了。app
@SpringBootApplication public class MainController extends AbstractJavaFxApplicationSupport { /** * The entry point of application. * * @param args the input arguments */ public static void main(String[] args) { launchApp(MainController.class, MainStageView.class, args); } /** * Start. * * @param stage the stage * * @exception Exception the exception */ @Override public void start(Stage stage) throws Exception { super.start(stage); } }
繼承自AbstractJavaFxApplicationSupport
能夠看到源碼,典型的Aware
。而後就能夠運行了。
能夠看到
這個是啓動動畫。能夠自定義啓動動畫,我的認爲,啓動動畫仍是頗有必要的,由於 springboot 啓動費時仍是比較多的,來個啓動動畫,逼格滿滿的。
/** * @description * @create 2017-05-20 下午2:54 * @email spartajet.guo@gmail.com */ public class CustomSplash extends SplashScreen { /** * Use your own splash image instead of the default one * * @return "/splash/javafx.png" */ @Override public String getImagePath() { return super.getImagePath(); } /** * Customize if the splash screen should be visible at all * * @return true by default */ @Override public boolean visible() { return super.visible(); } }
最經常使用的就是這兩個方法了,一個是更換照片,另外一個是是否顯示啓動動畫。
JavaFX-Maven-Plugin能夠打包 jar、native、webbundle、key-store這些。
因爲我是 mac,通常用 jar和 native,執行命令mvn jfx:native
會看到打包成了pkg 和 dmg 兩種類型的安裝包。而且都是180M 左右。因爲沒有 windows 計算機,因此還不知道打包成 exe 的狀態。這麼大的包,主要是由於 java 的 jdk 問題,模塊化之後就行了。