JavaFx系列教程之一:JavaFx+Springboot+Maven 開發打包教程

最近在用 JavaFx 開發窗體程序,而且之後打算把全部的窗體軟件切換到 JavaFx 上面,而且還想用 springboot 的__各類好處,集成了 springboot 就能夠愉快的用各類服務了。因此就有了這個博客。。。
我原本想本身寫一個 javafx-spring-boot-starter 的,其原理也是很簡單地,利用 springbootaware 就能夠了。可是發現德國這哥們已經寫了一個,就變懶了。哎,沒辦法,我真的是太懶了。
本次的代碼Github 地址: https://github.com/spartajet/...

1. 介紹

javafxspringboot支持的庫,官方是沒有的,開源有一大堆。我採用的是springboot-javafx-support 地址是:springboot-javafx-support .這個庫文檔比較全,比較詳細,文檔地址:Spring Boot and JavaFx8 .css

springboot必須用maven,不然那簡直是災難。最重要的是打包工具。我用的是JavaFX Maven Plugin 地址:JavaFX Maven Pluginhtml

2. Maven 配置

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

3. Javafx 集成springboot

3.1 建立 FXML 佈局文件

能夠用 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>

3.2 MainStageController

每個 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 {

}

3.3 MainStageView

這個是比較特殊的,在普通的 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

3.3 MainController

@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 啓動費時仍是比較多的,來個啓動動畫,逼格滿滿的。

3.4 啓動動畫

/**
 * @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();
    }
}

最經常使用的就是這兩個方法了,一個是更換照片,另外一個是是否顯示啓動動畫。

4.0 打包

JavaFX-Maven-Plugin能夠打包 jar、native、webbundle、key-store這些。
因爲我是 mac,通常用 jar和 native,執行命令mvn jfx:native 會看到打包成了pkg 和 dmg 兩種類型的安裝包。而且都是180M 左右。因爲沒有 windows 計算機,因此還不知道打包成 exe 的狀態。這麼大的包,主要是由於 java 的 jdk 問題,模塊化之後就行了。

相關文章
相關標籤/搜索