JavaFx:采用SceneBuilder方式实现格式化java源文件(引入fxml文件完成样式布局)

本文主要是介绍JavaFx:采用SceneBuilder方式实现格式化java源文件(引入fxml文件完成样式布局),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开发环境:jdk8openjfx11.0.2eclipse

1. 声明

当前内容主要为本人学习和了解使用SceneBuilder方式实现样式布局,并实现之前的格式化java源文件并显示(本人直接以lib方式导入javafx依赖)

基本步骤:

  1. 使用SceneBuilder画图
  2. 使用Controller控制调用事件
  3. 加载fxml文件完成渲染
  4. 读取java源文件并使用javaparser进行格式化输出在TextArea
  5. 弹出消息窗口提示错误事件(alert)

基本pom

<dependency><groupId>com.github.javaparser</groupId><artifactId>javaparser-symbol-solver-core</artifactId><version>3.22.1</version>
</dependency>

关于javaparser的使用参考之前的博文

2. 下载和使用SceneBuilder

1.直接在openjfx官方下载(这里选择jdk1.8的版本):openjfx-java1.8

在这里插入图片描述
这里直接下载jar的可执行包,使用java -jar启动

2. 开始画图(直接开始画图操作)
在这里插入图片描述
3.为所有的组件添加fx:id属性,方便与controller中的属性进行绑定操作

在这里插入图片描述
在这里插入图片描述

4.最后生成一个fxml文件,考入启动main方法相同目录即可
在这里插入图片描述

javaFileFormatTolls.fxml其内容如下:

<?xml version="1.0" encoding="UTF-8"?><?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?><VBox prefHeight="436.0" prefWidth="657.0" xmlns="http://javafx.com/javafx/8.0.151" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.hy.java.gui.javafx.javafile.controller.JavaFileFormatAppController" ><children><GridPane alignment="CENTER_RIGHT" prefHeight="28.0" prefWidth="640.0"><columnConstraints><ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /><ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /><ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /></columnConstraints><rowConstraints><RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /></rowConstraints><children><TextField fx:id="sourceJavaFilePath" GridPane.columnIndex="1" /><Label alignment="CENTER_RIGHT" prefHeight="20.0" prefWidth="216.0" text="源文件" textAlignment="RIGHT"><GridPane.margin><Insets /></GridPane.margin></Label><Button mnemonicParsing="false" onAction="#handlerFormatButtonClick" text="格式化" GridPane.columnIndex="2" /></children><opaqueInsets><Insets /></opaqueInsets><VBox.margin><Insets bottom="10.0" top="10.0" /></VBox.margin></GridPane><AnchorPane><children><SplitPane dividerPositions="0.5" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"><items><AnchorPane prefHeight="469.0" prefWidth="324.0"><children><TextArea fx:id="leftTextArea" layoutY="7.0" prefHeight="278.0" prefWidth="315.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" /></children></AnchorPane><AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="278.0" prefWidth="253.0"><children><TextArea fx:id="rightTextArea" editable="false" layoutX="7.0" prefHeight="278.0" prefWidth="315.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" /></children></AnchorPane></items></SplitPane></children></AnchorPane></children>
</VBox>

3.开始编写代码

1.controller层:

package com.hy.java.gui.javafx.javafile.controller;import java.io.File;
import java.io.IOException;
import java.util.Optional;import com.hy.java.gui.javafx.javafile.FormatTools;import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import javafx.scene.control.ButtonBar;public class JavaFileFormatAppController {@FXMLTextArea leftTextArea;@FXMLTextArea rightTextArea;@FXMLTextField sourceJavaFilePath;@FXMLpublic void handlerFormatButtonClick() {//System.out.println("点击当前的格式化按钮");//System.out.println("开始获取当前左边文本框中的内容:" + leftTextArea.getText());//System.out.println("开始获取当前右边文本框中的内容:" + rightTextArea.getText());//System.out.println("开始和获取输入框的内容:" + sourceJavaFilePath.getText());String text = sourceJavaFilePath.getText();if (isEmpty(text)) {// 提示输入文件showErrorAlert("错误", "请输入需要格式化的java源文件");return;} else {File file = new File(text);if (file.exists() && !file.isDirectory() && file.canRead()) {try {String leftTextAreaContext = this.leftTextArea.getText();if (isEmpty(leftTextAreaContext)) {String fileContext = FormatTools.getFileContext(file);leftTextArea.setText(fileContext);String formatJavaFile = FormatTools.formatJavaFile(fileContext);rightTextArea.setText(formatJavaFile);}} catch (IOException e) {//e.printStackTrace();showErrorAlert("错误",e.getMessage());}} else {// 不可操作showErrorAlert("错误", "当前文件不可读");}}}/*** * @author hy* @createTime 2021-07-25 10:02:01* @description 弹出一个消息框* @param title* @param msg**/private void showErrorAlert(String title, String msg) {Alert alert = new Alert(AlertType.ERROR, msg, ButtonType.YES, ButtonType.NO);alert.setTitle(title);alert.setHeaderText("");Optional<ButtonType> showAndWait = alert.showAndWait();if (showAndWait.get() == ButtonType.YES) {alert.close();}}private boolean isEmpty(String text) {if (text == null || "".equals(text.trim())) {return true;}return false;}}

其中以@FXML开始的就是绑定的对应fxml中的组件中的fx:controller范围内的fx:id,或者#方法名称

2.开始编写文件格式化工具(FormatTools.java)

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Optional;import com.github.javaparser.JavaParser;
import com.github.javaparser.ParseResult;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.ImportDeclaration;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.PackageDeclaration;import de.hunsicker.jalopy.Jalopy;public abstract class FormatTools {public static String formatJavaFile(String fileContext) {JavaParser javaParser = new JavaParser();ParseResult<CompilationUnit> parse = javaParser.parse(fileContext);StringBuffer buffer = new StringBuffer();if (parse.isSuccessful()) {Optional<CompilationUnit> result = parse.getResult();CompilationUnit compilationUnit = result.get();List<Node> childNodes = compilationUnit.getChildNodes();for (Node node : childNodes) {if (node instanceof ImportDeclaration) {buffer.append(String.valueOf(node));} else if (node instanceof PackageDeclaration) {buffer.append(String.valueOf(node));} else {buffer.append(String.valueOf(node));buffer.append("\r\n");}}}return buffer.toString();}public static String getFileContext(File file) throws IOException {StringBuffer buffer = new StringBuffer();try (BufferedReader bufferReader = new BufferedReader(new InputStreamReader(new FileInputStream(file)))) {String line = null;while ((line = bufferReader.readLine()) != null) {buffer.append(line);buffer.append("\r\n");}}return buffer.toString();}}

3.开始编写入口类

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;public class JavaFileFormatTest extends Application {public static void main(String[] args) {launch(args);}@Overridepublic void start(Stage stage) throws Exception {Parent root = FXMLLoader.load(getClass().getResource("javaFileFormatTools.fxml"));Scene scene = new Scene(root, 1200,800);stage.setTitle("Java File Formatter");stage.setScene(scene);stage.show();}
}

4. 测试

在这里插入图片描述
输入需要格式化的文件名称路径,并点击格式化
在这里插入图片描述
实现代码格式化成功,如果未填写直接格式化就会出现提示框

在这里插入图片描述
注意这个alert,实现成功!

这篇关于JavaFx:采用SceneBuilder方式实现格式化java源文件(引入fxml文件完成样式布局)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/488417

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结