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类,这里…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...