文章目录
JavaFX入门和使用实践
一、前言
- 操作系统:Windows 10 专业版
- JDK 版本:1.8
- 开发工具:IntelliJ IDEA 2020.2.2
JavaFX:https://www.oracle.com/cn/java/technologies/javase/javafx-overview.html
OpenJFX:https://openjfx.io/
JavaFX中文资料:http://www.javafxchina.net/blog/docs/tutorial3/
JavaFX Scene Builder Archive:https://www.oracle.com/java/technologies/javafxscenebuilder-1x-archive-downloads.html
POI 操作:https://blog.csdn.net/u011424614/article/details/104370924
创建 JavaFX 项目:https://blog.csdn.net/u011424614/article/details/112383294
二、正文
场景说明: 读取并显示 txt 文件的内容,最后打包项目为 exe 程序
1.创建项目
1)创建项目
- 使用 IntelliJ IDEA 开发工具创建 JavaFX 项目,并添加 maven 构建工具的支持;这步可以参考之前的文章
创建项目:https://blog.csdn.net/u011424614/article/details/112383294
2)移动 fxml 文件
- 将
sample.fxml
移动到resources
文件夹中,修改Main.java
的 fxml 文件引用路径
package com.sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("/sample.fxml"));
primaryStage.setTitle("TXT读取工具 V1.0");
primaryStage.setScene(new Scene(root, 580, 400));
primaryStage.setResizable(false); // 禁止缩放窗口
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
2.界面布局
- 打开
sample.fxml
,点击编辑区域左下角的Scene Builder
选项卡
如果出现提示:Failed to open the file in the Scene Builder.
解决方法查看当前文章的
三、其它
-1.Scene Builder kit使用
- 左侧选择控件,拖拽到显示区域;先选择容器 Pane,然后选择其它控件
- 控件:Label、TextField(属性:Editable 去勾)、Button、TextArea(属性:Editable 去勾)
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<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="com.sample.Controller">
<children>
<Label layoutX="231.0" layoutY="14.0" text="TXT读取工具">
<font>
<Font size="24.0" />
</font>
</Label>
<Label layoutX="37.0" layoutY="77.0" text="请选择文件" />
<TextField fx:id="tfShowPath" editable="false" layoutX="118.0" layoutY="72.0" prefHeight="30.0" prefWidth="335.0" />
<Button fx:id="btnOpenFile" layoutX="462.0" layoutY="72.0" mnemonicParsing="false" text="打开文件..." />
<TextArea fx:id="taShowText" editable="false" layoutX="37.0" layoutY="119.0" prefHeight="258.0" prefWidth="517.0" />
</children>
</Pane>
3.业务处理
1)绑定控件
-
sample.fxml
文件的Pane
容器指定Controller.java
-
sample.fxml
文件的控件设置IDfx:id="controlsId"
-
Controller.java
实现Initializable
-
Controller.java
定义与 fxml 中 id 名称相同的属性,并添加注解@FXML
2)选择文件
3)读取并显示
-
注意: 代码中控件的引用是
javafx.scene.control
;而不是java.awt
- 添加日志依赖:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
-
Controller.java
代码
package com.sample;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.stage.FileChooser;
import javafx.stage.Window;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.net.URL;
import java.util.ResourceBundle;
public class Controller implements Initializable {
@FXML
private TextField tfShowPath; // 显示文件路径
@FXML
private Button btnOpenFile; // 打开文件按钮
@FXML
private TextArea taShowText; // 显示内容
// 日志
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void initialize(URL location, ResourceBundle resources) {
// 打开文件按钮-事件绑定
handleBtnOpenFile(location, resources);
}
/**
* 打开文件按钮-事件绑定
* @param location
* @param resources
* */
private void handleBtnOpenFile(URL location, ResourceBundle resources) {
// 按钮绑定事件
btnOpenFile.setOnAction(e -> {
// 文件选择控件
FileChooser fileChooser = new FileChooser();
// 过滤文件格式
/*FileChooser.ExtensionFilter xlsFileChooser
= new FileChooser.ExtensionFilter("Excel files (*.xls)","*.xls");
FileChooser.ExtensionFilter xlsxFileChooser
= new FileChooser.ExtensionFilter("Excel files (*.xlsx)","*.xlsx");*/
FileChooser.ExtensionFilter txtFileChooser
= new FileChooser.ExtensionFilter("TXT files (*.txt)","*.txt");
fileChooser.getExtensionFilters().addAll(txtFileChooser);
// 打开选择窗口
Window window = ((Node)e.getSource()).getScene().getWindow();
File chooseFile = fileChooser.showOpenDialog(window);
if(chooseFile != null){
// System.out.println(chooseFile.getAbsolutePath());
// 设置路径到显示控件
tfShowPath.setText(chooseFile.getAbsolutePath());
// 读取数据
String result = readFile(chooseFile.getAbsolutePath());
// 显示内容
taShowText.setText(result);
}
});
}
/**
* 根据文件路径,读取内容
* @param filepath 文件路径
* */
public String readFile(String filepath){
File file = null;
FileInputStream fileInputStream = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
try {
file = new File(filepath);
if(file.isFile() && file.exists()){
// 读取内容
fileInputStream = new FileInputStream(file);
inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
bufferedReader = new BufferedReader(inputStreamReader);
StringBuffer stringBuffer = new StringBuffer();
String lineText = "";
while ((lineText = bufferedReader.readLine()) != null){
stringBuffer.append(lineText).append("\n");
}
logger.info(stringBuffer.toString());
return stringBuffer.toString();
}else {
String msg = "文件路径无效.";
logger.info(msg);
return msg;
}
} catch (IOException e) {
// e.printStackTrace();
String msg = "读取数据错误:"+e.getMessage();
logger.error(msg);
return msg;
}
}
}
4.打包项目
- 工具栏
File
-Project Structure...
-Artifacts
选项卡 -+
加号 -JavaFx Application
-From module '项目名称'
-
选择需要打包的 maven 依赖包 :Output Layout 选项卡 - Available Elements 窗口 - 项目名称右击 -
Put into Output Root
-
Java Fx 选项卡 配置项目信息
-
Application class
: 必填,用于打包后,作为启动入口) -
Native bundle
: 选择all
;表示 jar 和 exe 都打包,默认只打包 jar 包
-
-
Apply
应用设置 - 工具栏
Build
-Build Artifacts...
- 打包后目录:项目根目录
out
文件夹,jar 包(都需要 jre 环境)和 exe 都可以双击打开
三、其它
1.Scene Builder Kit使用
说明: 这里有 两种方法 ,请自行选择
方法一: 使用 idea 的 Scene Builder Kit
1) 根据 Idea 提示,获取 scenebuilderkit-11.0.5.jar
的下载路径,使用*的方式,下载 jar 包
提示提取的路径:
https://cache-redirector.jetbrains.com/jetbrains.bintray.com/intellij-third-party-dependencies/org/jetbrains/intellij/deps/scenebuilderkit/11.0.5/scenebuilderkit-11.0.5.jar
2) 将下载的 scenebuilderkit-11.0.5.jar
拷贝到 idea 安装目录的 lib
文件夹下
3) 打开 fxml 文件,编辑窗口左下角,切换到 Scene Builder 选项卡,点击 Download JavaFx
,等待其它 jar 包下载完成
方法二: 使用 Oracle 官网的 Scene Builder Kit
1)下载并安装
官网下载:https://www.oracle.com/java/technologies/javafxscenebuilder-1x-archive-downloads.html
- 下载并安装
javafx_scenebuilder-2_0-windows.msi
2)IDEA 配置
-
工具栏
File
-Settings...
(1)
Plugins
菜单:查询JavaFX
;确保以安装和启用(2)
Languages & Frameworks
菜单:点击JavaFX
,选择 SBK exe 文件
3)使用
- fxml 文件右击 -
Open In SceneBuilder
2.ChoiceBox控件
- 选择触发事件
cbSelectId.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
// System.out.println(newValue+" newValue="+cbLngLatField.getItems().get(newValue.intValue()));
cbLngLatFieldIndex = newValue.intValue();
}
});
- 设置默认值(需要先设置数据项,才能设置数据项中的值)
cbSelectId.getItems().removeAll(cbSelectId.getItems()); // 先清空之前的数据项
cbSelectId.getItems().addAll(datas); // 添加到下拉框中
cbSelectId.setValue("abc"); // 默认选中项