JavaFx 21 项目Markdown 预览、编辑、新建、文件树、删除、重命名


项目文件结构
项目的源代码和资源文件存放在以下路径:
-
源代码:
src/main/java/com/kong/markdown/包含多个 Java 文件,主要实现了应用的功能:App.java:主类,可能包含应用的启动逻辑。FileService.java:可能与文件操作相关的服务类。MainController.java:控制器类,可能负责与 UI 的交互。MarkdownProcessor.java:处理 Markdown 解析和预览的类。UIHelper.java:辅助类,可能用于界面上的一些常见功能。
-
资源文件:
src/main/resources/包含应用的静态资源文件:.css文件:样式表,如dark.css、light.css、styles.css。.fxml文件:JavaFX 的 FXML 文件,用于定义 UI 布局。icons/:图标文件,用于界面显示的图标。markdown.exe:可能是 Markdown 相关的可执行文件,或用于编辑的工具。info.md:Markdown 格式的文本,可能作为应用的一部分或示例内容。META-INF/MANIFEST.MF:包含 JAR 文件元数据的清单文件。
重点文件
1. pom.xml 配置文件
pom.xml 文件已经配置了 JavaFX 依赖,并且包含 javafx-maven-plugin 来处理 JavaFX 应用的构建。
2. App.java
这是应用的主类。它通常是 javafx.application.Application 的子类,并重写了 start() 方法,作为应用的入口。
3. FXML 文件
main-view.fxml:用于定义应用的用户界面布局,是 JavaFX 的界面描述文件。
4. CSS 文件
dark.css、light.css:定义了两种主题的样式表,分别用于深色和浅色模式的 UI。
App.java 代码
这是应用的主类,它继承自 javafx.application.Application,并且重写了 start() 方法,这是 JavaFX 应用的入口。以下是该类的关键完整代码:
package com.kong.markdown;import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;import java.io.InputStream;public class App extends Application {public static void main(String[] args) {launch(); // 启动 JavaFX 应用}@Overridepublic void start(Stage stage) throws Exception {// 加载 FXML 文件,设置主界面FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource("/main-view.fxml"));Scene scene = new Scene(fxmlLoader.load(), 1200, 600);// 设置窗口标题和图标stage.setTitle("Markdown Editor - 更优雅的Markdown编辑器");InputStream iconStream = getClass().getResourceAsStream("/icons/icon.png");if (iconStream == null) {throw new IllegalStateException("Icon resource not found!");}stage.getIcons().add(new Image(iconStream));// 设置窗口大小及最小限制stage.setWidth(1200);stage.setHeight(600);stage.setMinWidth(800);stage.setMinHeight(400);// 显示窗口stage.setScene(scene);stage.show();}
}
主要功能:
- 主类
App:继承Application类,是 JavaFX 应用的入口。 start()方法:设置应用的主窗口,包括:- 加载 FXML 布局文件:
main-view.fxml。 - 设置窗口的标题、图标以及大小。
- 使用
FXMLLoader加载界面布局,设置窗口大小和最小限制。 - 显示窗口。
- 加载 FXML 布局文件:
该代码简洁地启动了 JavaFX 应用,并且设置了应用窗口的界面和样式。
main-view.fxml 布局文件
<?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.control.*?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.web.WebView?>
<BorderPane xmlns:fx="http://javafx.com/fxml" xmlns="http://javafx.com/javafx"fx:controller="com.kong.markdown.MainController"><top><MenuBar fx:id="menuBar"><Menu text="文件"><MenuItem text="打开"/><MenuItem text="保存" onAction="#onSaveFile"/><SeparatorMenuItem/><MenuItem text="退出" onAction="#onExitApp"/></Menu><Menu text="视图"><CheckMenuItem text="显示预览" selected="true" onAction="#onTogglePreview"fx:id="togglePreviewMenuItem"/></Menu></MenuBar></top><center><SplitPane dividerPositions="0.2, 0.6" fx:id="splitPane"><!-- 左侧的文件树 --><TreeView fx:id="fileTreeView"/><!-- 左侧的 Markdown 编辑器 --><TextArea fx:id="markdownEditor" prefWidth="200"/><!-- 右侧的 HTML 预览 --><WebView fx:id="markdownPreview" prefWidth="200"/></SplitPane></center><!-- 在底部添加状态栏 --><bottom><Label fx:id="statusLabel" text="状态栏:" style="-fx-padding: 5px;"/></bottom>
</BorderPane>
这是 JavaFX 应用的界面布局文件,使用了 FXML 格式。该文件定义了一个 BorderPane 布局,主要分为几个区域:
-
顶部菜单栏 (
top):- 包含一个
MenuBar,包括两个菜单:- 文件菜单:包含 “打开”、“保存” 和 “退出” 功能项。 “保存” 和 “退出” 菜单项绑定了对应的动作(
onSaveFile和onExitApp)。 - 视图菜单:包含一个复选框菜单项 “显示预览”,其绑定了
onTogglePreview动作。
- 文件菜单:包含 “打开”、“保存” 和 “退出” 功能项。 “保存” 和 “退出” 菜单项绑定了对应的动作(
- 包含一个
-
中心区域 (
center):- 使用
SplitPane布局将中心区域分为两个部分:- 左侧区域:一个
TreeView控件,用于显示文件树。 - 右侧区域:一个 Markdown 编辑器(具体控件未完全显示,可能是
TextArea或其他控件)。
- 左侧区域:一个
SplitPane控制分隔条的位置,以便用户调整左侧和右侧的区域大小,dividerPositions="0.2, 0.6"表示初始的比例。 - 使用
主要控件:
MenuBar:包含文件操作和视图设置的菜单。SplitPane:用于分割左右区域,适合实现 Markdown 编辑器和预览分屏效果。TreeView:左侧的文件浏览树,用户可以在其中浏览和选择文件。
MainController.java 控制器类
package com.kong.markdown;import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.web.WebView;
import javafx.stage.FileChooser;
import org.apache.commons.lang3.StringUtils;import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;/*** @author kong*/
public class MainController {private final MarkdownProcessor markdownProcessor = new MarkdownProcessor();private final FileService fileService = new FileService();private File currentFile;private boolean isPreviewVisible = true;@FXMLprivate TreeView<String> fileTreeView;@FXMLprivate TextArea markdownEditor;@FXMLprivate WebView markdownPreview;@FXMLprivate Label statusLabel;@FXMLprivate SplitPane splitPane;@FXMLprivate MenuBar menuBar;@FXMLprivate MenuItem togglePreviewMenuItem;@FXMLprivate 相关文章:
JavaFx 21 项目Markdown 预览、编辑、新建、文件树、删除、重命名
项目文件结构 项目的源代码和资源文件存放在以下路径: 源代码: src/main/java/com/kong/markdown/ 包含多个 Java 文件,主要实现了应用的功能: App.java:主类,可能包含应用的启动逻辑。FileService.java:可能与文件操作相关的服务类。MainController.java:控制器类,可…...
git项目提交步骤(简洁版)
1.创建仓库 2.填写 信息 3.点击这个按钮 4.找到要上传的文件,在目录内右键点击 5.依次执行命令 在命令窗口中输入:git init 复制仓库地址: 在命令窗口中输入:git remote add origin 仓库地址 在命令窗口中输入:…...
风水算命系统架构与功能分析
系统架构 服务端:Java(最低JDK1.8,支持JDK11以及JDK17)数据库:MySQL数据库(标配5.7版本,支持MySQL8)ORM框架:Mybatis(集成通用tk-mapper,支持myb…...
Clojure语言的学习路线
Clojure语言的学习路线 Clojure是一种现代的Lisp方言,运行于Java虚拟机(JVM)上。它具备强大的函数式编程特性,支持并发和多线程编程,适合处理复杂的数据和计算任务。由于其简洁和灵活的语法,Clojure在数据…...
网络安全核心目标CIA
网络安全的核心目标是为关键资产提供机密性(Confidentiality)、可用性(Availablity)、完整性(Integrity)。作为安全基础架构中的主要的安全目标和宗旨,机密性、可用性、完整性频频出现,被简称为CIA,也被成为你AIC,只是顺序不同而已…...
Wi-Fi Direct (P2P)原理及功能介绍
目录 Wi-Fi Direct (P2P)介绍Wi-Fi Direct P2P 概述P2P-GO(P2P Group Owner)工作流程 wifi-Direct使用windows11 wifi-directOpenwrtwifi的concurrent mode Linux环境下的配置工具必联wifi芯片P2P支持REF Wi-Fi Direct ÿ…...
Perl语言的数据结构
Perl语言的数据结构 Perl是一种功能强大的、灵活的脚本语言,广泛用于文本处理、系统管理、网络编程以及许多其他领域。其灵活性不仅体现在语法上,还体现在其丰富的数据结构上。本文将深入探讨Perl的主要数据结构,包括标量、数组、哈希以及引…...
【MFC】设置CTreeCtrl单个节点的文字颜色
问题 功能调整需要依据不同状态设置树控件中单个节点的文字颜色。 分析 1、CTreeCtrl本身有设置文字颜色的接口SetTextColor,但是这个接口是设置树控件整体的文字颜色。 2、在自定义接口可以对树控件单个节点进行更新文字颜色和背景颜色,接收自定义绘制…...
【CSS】设置滚动条样式
文章目录 基本语法用法案例 基本语法 在CSS中,可以使用 ::-webkit-scrollbar 和相关伪元素来为滚动条设置样式,但请注意这些伪元素是非标准的,主要用于WebKit内核浏览器(如Chrome、Safari)。 ::-webkit-scrollbar CSS …...
Gitlab-Runner配置
原理 Gitlab-Runner是一个非常强大的CI/CD工具。它可以帮助我们自动化执行各种任务,如构建、测试和部署等。Gitlab-Runner和Gitlab通过API通信,接收作业并提交到执行队列,Gitlab-Runner从队列中获取作业,并允许在不同环境下进行作…...
代码随想录 哈希 test 8
18. 四数之和 - 力扣(LeetCode) 与三数之和类似,重点在剪枝和去重的区别,由于target可正可负,因此需要分两种情况讨论,如果target为正,则若当前选择的元素之和大于target,需要跳出这…...
[SAP ABAP] 使用LOOP AT...ASSIGNING FIELD-SYMBOL 直接更新内表数据
使用 LOOP AT...ASSIGNING FIELD-SYMBOL... 可以直接修改内表中的数据,而不需要先将内表数据复制到相应的工作区,然后再更新回内表中,从而提高性能 针对上述代码进行优化,我们使用LOOP AT...ASSIGNING FIELD-SYMBOL 直接更新内表数…...
MySQL数据导出导入
一、数据导出 1.导出全库备份到本地的目录 mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 --routines--default-character-setutf8 --lock-all-tables --add-drop-database -A >db.all.sql 2.导出指定库到本地的目录(例如mysql库) mysqldump -u$USER -p$PASSWD -h127.…...
leetcode 127. 单词接龙
题目:127. 单词接龙 - 力扣(LeetCode) 先建立一颗trie树,从beginWord开始bfs;bfs的过程中,对trie树进行dfs寻找“只差一个字母”的其他未遍历到的字符串;直到bfs遍历到endWord。 struct Node …...
如何开发一个支持海量分布式锁的应用库
分布式锁是一种用于控制分布式系统中资源访问的同步机制,确保在任意时刻只有一个客户端能够获取到锁,并对共享资源进行操作。 作用 1.保证数据一致性:在多个节点并发执行的情况下,分布式锁可以防止同时修改同一份数据,…...
JavaScript系列(17)--类型系统模拟
JavaScript类型系统模拟 🎭 今天,让我们深入探讨JavaScript中的类型系统模拟。虽然JavaScript是一门动态类型语言,但我们可以通过各种方式来实现类型检查和验证。 类型系统基础 🌟 💡 小知识:JavaScript是…...
openssl编译
关于windows下,openssl编译 环境准备 安装 perl:https://djvniu.jb51.net/200906/tools/ActivePerl5_64.rar安装nasm:https://www.nasm.us/pub/nasm/releasebuilds/2.13.01/win64/nasm-2.13.01-installer-x64.exe下载opensll源码:https://o…...
校园网络综合布线系统设计与实践
校园网络综合布线系统设计与实践 摘要:随着信息时代的发展,网络综合布线显得更加重要。综合布线技术也日益引起人的重视。综合布线管理系统是一个实用性十分强的系统工程,同样又是现代社区信息化建设的基础与必要产品,是对多用途…...
如果商品信息更新,爬虫会失效吗?
当商品信息更新时,爬虫是否失效取决于更新的具体内容。以下是一些可能影响爬虫的因素: 可能导致爬虫失效的情况 HTML结构变化:如果 yiwugo 平台更新了商品详情页面的 HTML 结构,比如改变了元素的标签、类名或 ID,那么…...
【UE5 C++课程系列笔记】27——多线程基础——ControlFlow插件的基本使用
目录 步骤 一、搭建基本同步框架 二、添加委托 三、添加蓝图互动框架 四、修改为异步框架 完整代码 通过一个游戏初始化流程的示例来介绍“ControlFlows”的基本使用。 步骤 一、搭建基本同步框架 1. 勾选“ControlFlows”插件 2. 新建一个空白C类,这里…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
npm install 相关命令
npm install 相关命令 基本安装命令 # 安装 package.json 中列出的所有依赖 npm install npm i # 简写形式# 安装特定包 npm install <package-name># 安装特定版本 npm install <package-name><version>依赖类型选项 # 安装为生产依赖(默认&…...
