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安装
- 下载
- 安装,根据提示安装
- 在idea中添加scene-builder或者说直接通过fxml右键Open in SceneBuilder,首次打开需要指定SceneBuilder应用程序,后续打开会记住。
在SpringBoot中使用JavaFx
- 创建一个SpringBoot应用
- 添加依赖:
<!-- 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>
- 启动类改造
@SpringBootApplication
public class RetailDesktopClientApplication extends AbstractJavaFxApplicationSupport {
public static void main(String[] args) {
launch(RetailDesktopClientApplication.class, MainView.class,args);
}
}
- 创建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>
- 创建MainView类,继承自AbstractFxmlView
@Data
@FXMLView(value = "/views/main.fxml")
public class MainView extends AbstractFxmlView {
}
- 创建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文件中,不用每次都需要输入命令去手动打包)
- 添加插件
<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 Setup
和WiX Toolset
,插件作者也在文档中说明了,具体安装步骤如下。
2. 安装Inno Setup
和WiX 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目录下。