the site subtitle

SpringBoot+JavaFX开发桌面程序

2022.11.15

Java作为时下流行的开发语言,大多数时候都用于企业级WEB应用开发,基本上都是B/S架构,但其实JAVA也能很方便的开发C/S架构的桌面应用程序,大家是不是以为我要说AWT/SWing,错,今天我要说的是JAVA的后起之秀JavaFX,旨在替换掉AWT/SWing,当然啦,JavaFX也已经不算啥新技术了,在JDK1.8时内置,但在JDK11之后JavaFX和JDK分开发布,所以,如果小伙伴的开发环境不处于JDK8-11之间时,需要安装JavaFX。

什么是JavaFX

JavaFX是基于java语言的 图形化界面工具箱,带有大量的内置组件,如按钮,文本字段,表格,树,菜单,图表等
JavaFX支持 2D图形、3D图形、WebView
JavaFX编写的程序,可以运行在 Windows、Linux、Mac、iOS、Android / Chromebook、树莓派
JavaFX让使用Java语言 创建桌面应用程序 和 游戏变得更加容易
从Java 11开始,JavaFX已从Java SDK中删除。JavaFX已被分离到其自己的开源项目中。想要使用需要额外引用依赖包。

在使用JavaFX之前,我们需要了解一下为什么要使用它,它对比AWT/SWing有什么区别及优势。

  • JavaFX相对于AWT/SWing使用更加清凉简单。
  • JavaFX提供MVC支持
  • JavaFx使用CSS来设计外观和填充
  • 最重要的是,JavaFX的UI能单独写到fxml文件中,并且官方提供可拖拽式的UI设计工具SceneBuilder

SceneBuilder安装

  1. 下载
  2. 安装,根据提示安装
  3. 在idea中添加scene-builder或者说直接通过fxml右键Open in SceneBuilder,首次打开需要指定SceneBuilder应用程序,后续打开会记住。

在SpringBoot中使用JavaFx

  1. 创建一个SpringBoot应用
  2. 添加依赖:
<!-- https://mvnrepository.com/artifact/de.roskenet/springboot-javafx-support -->
<dependency>
    <groupId>de.roskenet</groupId>
    <artifactId>springboot-javafx-support</artifactId>
    <version>2.1.6</version>
</dependency>
<dependency>
    <groupId>de.roskenet</groupId>
    <artifactId>springboot-javafx-test</artifactId>
    <version>1.3.0</version>
    <scope>test</scope>
</dependency>
  1. 启动类改造
@SpringBootApplication
public class RetailDesktopClientApplication extends AbstractJavaFxApplicationSupport {
    public static void main(String[] args) {
        launch(RetailDesktopClientApplication.class, MainView.class,args);
    }
}
  1. 创建fxml文件,在resources下新建views文件夹,用于存放fxml文件,当前main.fxml文件使用SceneBuilder工具进行设计
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="com.fuyungroup.retail.controller.MainController"
>
   <center>
      <HBox prefHeight="100.0" prefWidth="200.0" BorderPane.alignment="CENTER">
         <children>
            <Label text="用户名" />
            <TextField fx:id="username" />
            <Button fx:id="btn" mnemonicParsing="false" text="获取用户名" onAction="#getUsername" />
         </children>
      </HBox>
   </center>
</BorderPane>
  1. 创建MainView类,继承自AbstractFxmlView
@Data
@FXMLView(value = "/views/main.fxml")
public class MainView extends AbstractFxmlView {

}
  1. 创建MainController,控制器,用于执行事件
@FXMLController
public class MainController {
    @FXML
    public TextField username;

    public void getUsername(){
        System.out.println(username.getText());
    }
}

到此OK,一个基于SpringBoot的JavaFX桌面程序helloworld就搭建完成啦。

项目打包

我们都知道,Java具有跨平台性,这很nice,Java的跨平台性归功于JVM,是JVM屏蔽了底层操作系统间的差异,要想跨平台,就必须得每台客户机都得安装JVM,也就是JRE(Java Runtime Environment),本来Java程序可以直接打包成EXE可执行文件的,但是它依赖JRE,在安装了JRE的客户机上面能完美运行,并且包也不大,但是考虑到很多客户机器上面是没有jre环境的,所以,我们需要将jre内置到程序当中去;那么如何内置呢?将jre放到exe文件同级目录下打成zip等压缩包传给客户?也不是不行,只是感觉这么做太草率敷衍了,下面就教大家如何把Java项目jar包打成各个平台等安装包文件(exe,msi等等,这里只讨论windows平台)

将项目打包成可安装的安装包文件

Java8提供了一个打包工具javapackager,该工具是个命令行工具,个人感觉不那么顺手,这里咱们使用一个maven插件(其实他也是使用的javapackager进行打包的,只是进行了封装,好处是能将配置写到pom.xml文件中,不用每次都需要输入命令去手动打包)

  1. 添加插件
<plugin>
    <groupId>io.github.fvarrui</groupId>
    <artifactId>javapackager</artifactId>
    <version>1.6.7</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>package</goal>
            </goals>
            <configuration>
                <!-- mandatory -->
                <mainClass>com.fuyungroup.retail.RetailDesktopClientApplication</mainClass>
                <!-- optional -->
                <bundleJre>true</bundleJre>
                <customizedJre>false</customizedJre>
		<!--<jrePath>/Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home/jre</jrePath>-->
                <jrePath>C:\Program Files\Java\jdk1.8.0_281\jre</jrePath>
                <generateInstaller>true</generateInstaller>
                <administratorRequired>false</administratorRequired>
                <platform>windows</platform>
                <copyDependencies>true</copyDependencies>
                <additionalResources>
                    <additionalResource>views</additionalResource>
                    <additionalResource>images</additionalResource>
                </additionalResources>
                <!--win平台相关的配置-->
                <winConfig>
                    <!--图标文件/logo-->
                    <icoFile>images/logo.png</icoFile>
                    <!--设置EXE文件公司名称。-->
                    <companyName>深圳市XXX科技有限公司</companyName>
                    <generateSetup>true</generateSetup>
                    <generateMsi>true</generateMsi>
                    <generateMsm>true</generateMsm>
                </winConfig>
            </configuration>
        </execution>
    </executions>
</plugin>

其实以上配置就能将项目打成exe文件了,之际将retail-desktop-client文件夹打包成压缩包发给有jre环境的客户就可以使用了,缺点上面也说了,下面我们开始将其打包成msi或者带有jre环境的exe安装包,需要注意的是,打包成windows平台下的msi及带jre环境的包需要安装两个软件,分别是Inno SetupWiX Toolset,插件作者也在文档中说明了,具体安装步骤如下。
2. 安装Inno SetupWiX Toolset,安装这两个软件也有量种方式,Chocolatey和Scoop,这两个都是Windows下的包管理工具,这里选择Scoop的方式,因为Scoop更加轻量。

  • 在windows中打开PowerShell
  • 执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser,在提示中输入Y
  • 执行irm get.scoop.sh | iex,这一步可能需要科学上网,多试几次。
  • 执行scoop bucket add extras
  • 安装Inno Setup,执行scoop install inno-setup
  • 安装WiX Toolset,执行scoop install wixtoolset

3.重启idea,因为安装的以上两个工具还未在idea的Terminal中生效,或者直接在PowerShell中继续下面的操作可省略该步骤
4. maven打包,执行mvn clean package -DskipTests

OK,到这里,项目打包成msi及exe已完成,成品在项目的target目录下。