1. 先创建一个springboot 程序(此步骤不做流程展示)
2. 更改springboot的版本依赖和导入所需依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.7</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<project.build.jdk>1.8</project.build.jdk>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--javafx-->
<dependency>
<groupId>de.roskenet</groupId>
<artifactId>springboot-javafx-support</artifactId>
<version>2.1.6</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>
<version>8.8.3</version>
<configuration>
<vendor>测试</vendor>
<mainClass>cn.mt4.follow.FollowOrderApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>
3.创建层级结构
3.1 在resources 目录下创建 fxml(可根据自己习惯更改) 文件夹 用于存放 .fxml 文件
3.2 在XXXApplication 主程序同一层级创建controller(可根据自己习惯更改) 和 view(可根据自己习惯更改) 文件夹
4. 编写代码
4.1 编写.fxml 文件内容(此文件是图形界面内容)
为了快速开发建议安装 JavaFX Scene Builder 2.0 工具,该工具可以进行拖拉拽的形式开发界面.例子:
图形界面画完之后 可以点击左上角的 File-> Save as 将内容保存为 .fxml 文件 ,并将此文件放到 resources 下的 fxml 文件夹中,博主这里命名为了LoginFxml.fxml ,示例代码如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.*?>
<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0"
prefWidth="600.0"
xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="cn.mt4.follow.controller.LoginController">
<children>
<Label fx:id="accountLabel" layoutX="129.0" layoutY="122.0" text="账号:">
<font>
<Font size="18.0"/>
</font>
</Label>
<Label fx:id="passwordLabel" layoutX="129.0" layoutY="188.0" text="密码:">
<font>
<Font size="18.0"/>
</font>
</Label>
<TextField fx:id="accountField" layoutX="200.0" layoutY="116.0" promptText="请输入账号">
<font>
<Font size="18.0"/>
</font>
</TextField>
<TextField fx:id="passwordField" layoutX="200.0" layoutY="182.0" promptText="请输入密码">
<font>
<Font size="18.0"/>
</font>
</TextField>
<Button fx:id="loginButton" layoutX="335.0" layoutY="283.0" mnemonicParsing="false" text="登录">
<font>
<Font size="18.0"/>
</font>
</Button>
<Button fx:id="resetButton" layoutX="170.0" layoutY="283.0" mnemonicParsing="false" text="重置">
<font>
<Font size="18.0"/>
</font>
</Button>
</children>
</Pane>
注意 JavaFX Scene Builder 2.0 保存的.fxml 文件中是没有 fx:controller 和 fx:id 这两个内容的,需要自己填写.
4.2 分别在view 和 controller 文件夹中创建对应的类
view 类 需要继承 AbstractFxmlView 类,并使用@FXMLView 注解 与 对应的.fxml 文件做绑定.如以下示例:
package cn.mt4.follow.view;
import de.felixroske.jfxsupport.AbstractFxmlView;
import de.felixroske.jfxsupport.FXMLView;
@FXMLView(value = "/fxml/LoginFxml.fxml")
public class LoginView extends AbstractFxmlView {
}
controller 类 需要 实现 Initializable 接口 ,并重写 initialize 方法,如以下示例:
package cn.mt4.follow.controller;
import de.felixroske.jfxsupport.FXMLController;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import java.net.URL;
import java.util.ResourceBundle;
@FXMLController
public class LoginController implements Initializable {
@FXML
private TextField accountField;
@FXML
private TextField passwordField;
@FXML
private Button loginButton;
/**
* 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
* the root object was not localized.
*/
@Override
public void initialize(URL location, ResourceBundle resources) {
loginButton.setOnAction(e -> {
String accountFieldText = accountField.getText();
String passwordFieldText = passwordField.getText();
System.out.println("accountFieldText:" + accountFieldText);
System.out.println("passwordFieldText:" + passwordFieldText);
});
}
}
注意: 这里 TextField 和 Button 导入的jar 包是 javafx.scene.control.*
accountField 等属性名与 .fxml 文件中fx:id 定义的名称保持一致
4.3 更改XXXApplication主程序的内容
需要继承 AbstractJavaFxApplicationSupport 类,示例代码:
package cn.mt4.follow;
import cn.mt4.follow.view.LoginView;
import de.felixroske.jfxsupport.AbstractJavaFxApplicationSupport;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.Collection;
@SpringBootApplication
public class FollowOrderApplication extends AbstractJavaFxApplicationSupport {
public static void main(String[] args) {
launch(FollowOrderApplication.class, LoginView.class, args);
// SpringApplication.run(FollowOrderApplication.class, args);
}
@Override
public void start(Stage stage) throws Exception {
stage.setTitle("XXX管理系统");
super.start(stage);
}
@Override
public Collection<Image> loadDefaultIcons() {
return super.loadDefaultIcons();
}
}
至此结束.运行main方法即可运行程序.
正式完成之后需要打包成 可执行文件 ,因在pom 中 导入了 javafx-maven-plugin 插件 ,所以可以在maven中 使用 双击 jfx:native 来打包,运行成功之后会在 target/jfx/native 目录中 生成 .exe 文件 .