diff --git a/.gitee/ISSUE_TEMPLATE/bug.yml b/.gitee/ISSUE_TEMPLATE/bug.yml
index 21556cf..3906921 100644
--- a/.gitee/ISSUE_TEMPLATE/bug.yml
+++ b/.gitee/ISSUE_TEMPLATE/bug.yml
@@ -1,7 +1,7 @@
name: Bug 反馈
description: 当你在代码中发现了一个 Bug,导致应用崩溃或抛出异常,或者有一个组件存在问题,或者某些地方看起来不对劲。
title: "[Bug]: "
-labels: ["bug"]
+labels: [ "bug" ]
body:
- type: markdown
attributes:
diff --git a/.gitee/ISSUE_TEMPLATE/feature.yml b/.gitee/ISSUE_TEMPLATE/feature.yml
index 6291f2f..59bc7a0 100644
--- a/.gitee/ISSUE_TEMPLATE/feature.yml
+++ b/.gitee/ISSUE_TEMPLATE/feature.yml
@@ -1,7 +1,7 @@
name: 功能建议
description: 对本项目提出一个功能建议
title: "[功能建议]: "
-labels: ["feature"]
+labels: [ "feature" ]
body:
- type: markdown
attributes:
diff --git a/.gitee/ISSUE_TEMPLATE/refactor.yml b/.gitee/ISSUE_TEMPLATE/refactor.yml
index 94cff32..c07bd8f 100644
--- a/.gitee/ISSUE_TEMPLATE/refactor.yml
+++ b/.gitee/ISSUE_TEMPLATE/refactor.yml
@@ -1,7 +1,7 @@
name: 重构
description: 对本项目提出一个功能建议
title: "[重构]: "
-labels: ["refactor"]
+labels: [ "refactor" ]
body:
- type: textarea
id: related-problem
diff --git a/README.md b/README.md
index 983c795..c43ae95 100644
--- a/README.md
+++ b/README.md
@@ -4,8 +4,9 @@


+JNotepad(Java Notepad)是一款简约而强大的跨平台文本编辑器,旨在提供用户友好的界面和丰富的功能。无论你是在Linux、Windows还是macOS系统上使用,JNotepad都能满足你对文本编辑和查看的需求。
+JNotepad使用Java语言编写,并基于JavaFX框架开发,具有良好的可扩展性和稳定性。
-JNotepad(Java Notepad)是一款简约而强大的跨平台文本编辑器,旨在提供用户友好的界面和丰富的功能。无论你是在Linux、Windows还是macOS系统上使用,JNotepad都能满足你对文本编辑和查看的需求。 JNotepad使用Java语言编写,并基于JavaFX框架开发,具有良好的可扩展性和稳定性。
## 功能介绍
- 文本编辑和查看:JNotepad提供了完善的文本编辑和查看功能,使你能够轻松创建、编辑和浏览各种类型的文本文件。
@@ -16,31 +17,32 @@ JNotepad(Java Notepad)是一款简约而强大的跨平台文本编辑器,旨
- 基于Java:JNotepad使用Java语言编写,并基于JavaFX框架开发,具有良好的可扩展性和稳定性。
-
## 安装教程
-1. Windows 平台,可以直接使用我编译好的可执行程序或自己编译
+1. Windows 平台,可以直接使用我编译好的可执行程序或自己编译
[gitee-download]: https://gitee.com/jcnc-org/JNotepad/releases
+
[java-download]: https://www.oracle.com/cn/java/technologies/downloads/
+
[qq-url]: http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=zOfwWb1lcle68cbEdJCjSIp3Itx0nEC0&authKey=bOsZFT9OVYZpZQbS6IYO4onBQoeBorF5nanMEi1G%2FgPbzmUkOweXBo9qB0G34R5K&noverify=0&group_code=386279455
-
-
- [下载][gitee-download]
2. Linux/MacOS 平台,查看入门指南
-
## 入门指南
要使用 JNotepad,请按照以下步骤进行:
1. 下载并安装 Java(如果尚未安装)。
+
- [下载][gitee-download]
2. 克隆或下载 JNotepad 项目。
+
git clone https://gitee.com/jcnc-org/JNotepad.git
+
3. 在您偏好的 Java IDE 中打开项目。
## 使用方法
@@ -48,10 +50,12 @@ JNotepad(Java Notepad)是一款简约而强大的跨平台文本编辑器,旨
1. 运行 `JNotepad` 类以启动应用程序。
2. 主窗口将显示菜单栏、标签区域和状态栏。
3. 使用菜单栏执行各种操作:
- - `文件 > 新建`:创建一个带有空白文本区域的新标签。
- - `文件 > 打开`:打开现有文本文件进行编辑。
- - `文件 > 保存`:将当前活动标签的内容保存到关联文件中。
- - `文件 > 另存为`:将当前活动标签的内容保存为新文件。
+
+- `文件 > 新建`:创建一个带有空白文本区域的新标签。
+- `文件 > 打开`:打开现有文本文件进行编辑。
+- `文件 > 保存`:将当前活动标签的内容保存到关联文件中。
+- `文件 > 另存为`:将当前活动标签的内容保存为新文件。
+
4. 在每个标签的文本区域中编辑内容。
5. 状态栏将显示有关光标位置和文本统计信息的信息。
@@ -64,7 +68,9 @@ JNotepad(Java Notepad)是一款简约而强大的跨平台文本编辑器,旨
17.0.1
- ## 软件运行截图
+
+## 软件运行截图
+
- Windows 平台

- MacOS 平台
diff --git a/docs/开发指南.md b/docs/开发指南.md
index db0eecf..ac8389d 100644
--- a/docs/开发指南.md
+++ b/docs/开发指南.md
@@ -1,19 +1,31 @@
# 1. 开发流程
+
基于**AoneFlow**开发流程,具体请阅读:[在阿里,我们如何管理代码分支?](https://developer.aliyun.com/article/573549)
+
## 1.1 IDEA IDE版
-### 步骤一 Fork JCNC/JNotepad或同步JCNC/JNotepad到个人仓库
+
+### 步骤一 Fork JCNC/JNotepad或同步JCNC/JNotepad到个人仓库
+
#### 首次开发,进行Fork操作
+

+
#### 非首次开发,进行同步操作
+

### 步骤二 clone个人仓库或fetch
+
#### 首次开发,clone个人仓库
+

+
#### 非首次开发,执行fetch
+

### 步骤三 从remote下的master分支创建本地开发分支。
+
**特殊情况:开发依赖release分支已提交内容,或是对已提交内容进行修改,那么需要从release分支上进行拉取。**


@@ -23,12 +35,15 @@
### 步骤四 推送本地分支到远程
### 步骤五 发起Pull Request(PR)
+

**注意:目标分支选择预期要发布的release分支**
## 1.2 GIT命令行版本
+
步骤一、步骤二、步骤五同1.1操作
+
```shell
# 步骤三
git fetch
@@ -38,24 +53,28 @@ git push origin feature-demo
```
## 1.3 分支命名规则
-|issue类别|分支名格式|示例|
-|--------|--------|----|
-|功能/优化/文档修改|feature-issue编号|feature-I7W9LX|
-|bug fix| fix-issue编号| fix-I7W9LX|
-|代码重构|refactor-issue编号|refactor-I7W9LX|
+
+| issue类别 | 分支名格式 | 示例 |
+|------------|------------------|-----------------|
+| 功能/优化/文档修改 | feature-issue编号 | feature-I7W9LX |
+| bug fix | fix-issue编号 | fix-I7W9LX |
+| 代码重构 | refactor-issue编号 | refactor-I7W9LX |
# 2. IDEA插件配置
+
* 安装Resource Bundle插件

* 安装成功后,打开i18n.properties,可以看到Resource Bundle tab

# Q&A
+
Q: 本地开发时,主仓库合并了新代码,如何处理?
A: 继续完成本地开发,发起PR时再解决冲突。
Q: 解决冲突步骤是什么?
A: 一般按如下步骤。
+
1. 先同步主仓库
2. 本地仓库进行fetch
3. 本地开发分支merge/pull/rebase更新的release分支
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 48e1b7e..83da650 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,6 +1,6 @@
-
4.0.0
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 3843aa4..dbfe06e 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -23,11 +23,6 @@ module org.jcnc.jnotepad {
exports org.jcnc.jnotepad.controller.event.handler.menuBar;
exports org.jcnc.jnotepad.tool;
exports org.jcnc.jnotepad.Interface;
- exports org.jcnc.jnotepad.ui.module;
- exports org.jcnc.jnotepad.ui.setStage;
- exports org.jcnc.jnotepad.root.center.main.center.tab;
- exports org.jcnc.jnotepad.root.top.menu;
- exports org.jcnc.jnotepad.view.manager;
opens org.jcnc.jnotepad.app.config;
exports org.jcnc.jnotepad.root.center.main.bottom.status;
diff --git a/src/main/java/org/jcnc/jnotepad/LunchApp.java b/src/main/java/org/jcnc/jnotepad/LunchApp.java
index 393ae10..179db04 100644
--- a/src/main/java/org/jcnc/jnotepad/LunchApp.java
+++ b/src/main/java/org/jcnc/jnotepad/LunchApp.java
@@ -27,10 +27,6 @@ import java.util.concurrent.ExecutorService;
* @author 许轲
*/
public class LunchApp extends Application {
- /**
- * 线程池
- */
- private final ExecutorService threadPool = ThreadPoolManager.getThreadPool();
private static final Pane ROOT = new Pane();
private static final Scene SCENE;
@@ -40,6 +36,10 @@ public class LunchApp extends Application {
SCENE = new Scene(ROOT, width, length);
}
+ /**
+ * 线程池
+ */
+ private final ExecutorService threadPool = ThreadPoolManager.getThreadPool();
public static void main(String[] args) {
launch(args);
@@ -48,6 +48,7 @@ public class LunchApp extends Application {
public static Window getWindow() {
return SCENE.getWindow();
}
+
@Override
public void start(Stage primaryStage) {
Application.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet());
diff --git a/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java b/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java
index b9e11bc..ef0148e 100644
--- a/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java
+++ b/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java
@@ -30,6 +30,7 @@ public class AppConfigController {
private static final AppConfigController INSTANCE = new AppConfigController();
private AppConfig appConfig;
private String dir;
+
private AppConfigController() {
setDir(Paths.get(System.getProperty("user.home"), ".jnotepad").toString());
loadConfig();
diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/NewFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/NewFile.java
index a81cbc5..26c2a83 100644
--- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/NewFile.java
+++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/NewFile.java
@@ -4,8 +4,9 @@ import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.constants.TextConstants;
+import org.jcnc.jnotepad.root.center.main.bottom.status.JNotepadStatusBox;
import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTab;
-import org.jcnc.jnotepad.tool.UiUtil;
+import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTabPane;
import org.jcnc.jnotepad.ui.module.LineNumberTextArea;
import org.jcnc.jnotepad.view.manager.ViewManager;
@@ -33,7 +34,7 @@ public class NewFile implements EventHandler {
// 创建一个新的文本编辑区
LineNumberTextArea textArea = new LineNumberTextArea();
// TODO: refactor:统一TextArea新建、绑定监听器入口
- ViewManager viewManager = UiUtil.getViewManager();
+ ViewManager viewManager = ViewManager.getInstance();
// 创建标签页
JNotepadTab jNotepadTab = new JNotepadTab(
UiResourceBundle.getContent(TextConstants.NEW_FILE)
@@ -42,8 +43,8 @@ public class NewFile implements EventHandler {
// 设置当前标签页与本地文件无关联
jNotepadTab.setRelevance(false);
// 将Tab页添加到TabPane中
- UiUtil.getJnotepadTabPane().addNewTab(jNotepadTab);
+ JNotepadTabPane.getInstance().addNewTab(jNotepadTab);
// 更新编码信息
- UiUtil.getStatusBox().updateEncodingLabel();
+ JNotepadStatusBox.getInstance().updateEncodingLabel();
}
}
\ No newline at end of file
diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/OpenFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/OpenFile.java
index d69b0be..f73dc37 100644
--- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/OpenFile.java
+++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/OpenFile.java
@@ -84,7 +84,7 @@ public class OpenFile implements EventHandler {
*/
public void openFile(File file) {
// 获取标签页集合
- JNotepadTabPane jnotepadTabPane = UiUtil.getJnotepadTabPane();
+ JNotepadTabPane jnotepadTabPane = JNotepadTabPane.getInstance();
// 遍历标签页,查找匹配的标签页
for (Tab tab : jnotepadTabPane.getTabs()) {
// 获取绑定的文件
@@ -124,7 +124,7 @@ public class OpenFile implements EventHandler {
// 设置当前标签页关联本地文件
tab.setRelevance(true);
tab.setUserData(file);
- UiUtil.getJnotepadTabPane().addNewTab(tab);
+ JNotepadTabPane.getInstance().addNewTab(tab);
});
} catch (IOException ignored) {
LogUtil.getLogger(this.getClass()).info("已忽视IO异常!");
diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/RenameFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/RenameFile.java
index c152b44..247e7a6 100644
--- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/RenameFile.java
+++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/RenameFile.java
@@ -8,6 +8,7 @@ import javafx.stage.FileChooser;
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.constants.TextConstants;
import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTab;
+import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTabPane;
import org.jcnc.jnotepad.tool.LogUtil;
import org.jcnc.jnotepad.tool.UiUtil;
import org.jcnc.jnotepad.ui.dialog.factory.impl.TextFileChooserFactory;
@@ -26,7 +27,7 @@ public class RenameFile implements EventHandler {
@Override
public void handle(ActionEvent actionEvent) {
// 获取当前标签页
- JNotepadTab jnotepadtab = UiUtil.getJnotepadtab();
+ JNotepadTab jnotepadtab = JNotepadTabPane.getInstance().getSelected();
if (jnotepadtab == null || jnotepadtab.getText().isEmpty()) {
return;
}
@@ -90,7 +91,7 @@ public class RenameFile implements EventHandler {
// 获取原始文件对象
File file = (File) jnotepadtab.getUserData();
// 获取应用窗口并绑定
- File newFile = TextFileChooserFactory.getInstance()
+ File newFile = TextFileChooserFactory.getInstance()
.createFileChooser(
UiResourceBundle.getContent(TextConstants.RENAME),
jnotepadtab.getText(),
diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/SaveFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/SaveFile.java
index 5eff265..d21d170 100644
--- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/SaveFile.java
+++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/SaveFile.java
@@ -7,6 +7,8 @@ import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.constants.TextConstants;
import org.jcnc.jnotepad.controller.i18n.LocalizationController;
import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTab;
+import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTabPane;
+import org.jcnc.jnotepad.root.top.menu.JNotepadMenuBar;
import org.jcnc.jnotepad.tool.LogUtil;
import org.jcnc.jnotepad.tool.SingletonUtil;
import org.jcnc.jnotepad.tool.UiUtil;
@@ -34,7 +36,7 @@ public class SaveFile implements EventHandler {
@Override
public void handle(ActionEvent actionEvent) {
// 获取当前tab页
- JNotepadTab selectedTab = UiUtil.getJnotepadtab();
+ JNotepadTab selectedTab = JNotepadTabPane.getInstance().getSelected();
if (selectedTab == null) {
return;
}
@@ -50,7 +52,7 @@ public class SaveFile implements EventHandler {
if (CONFIG_NAME.equals(selectedTab.getText())) {
// 重新加载语言包和快捷键
SingletonUtil.getAppConfigController().loadConfig();
- UiUtil.getMenuBar().initShortcutKeys();
+ JNotepadMenuBar.getInstance().initShortcutKeys();
LocalizationController.initLocal();
logger.info("已刷新语言包!");
logger.info("已刷新快捷键!");
@@ -66,7 +68,7 @@ public class SaveFile implements EventHandler {
* @see LogUtil
*/
protected void saveTab(Class> currentClass) {
- JNotepadTab selectedTab = UiUtil.getJnotepadtab();
+ JNotepadTab selectedTab = JNotepadTabPane.getInstance().getSelected();
if (selectedTab == null) {
return;
}
diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/tool/SetBtn.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/tool/SetBtn.java
index f46891b..4d36719 100644
--- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/tool/SetBtn.java
+++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/tool/SetBtn.java
@@ -2,7 +2,7 @@ package org.jcnc.jnotepad.controller.event.handler.tool;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
-import org.jcnc.jnotepad.tool.UiUtil;
+import org.jcnc.jnotepad.ui.setStage.SetStage;
/**
@@ -21,7 +21,7 @@ public class SetBtn implements EventHandler {
*/
@Override
public void handle(ActionEvent event) {
- UiUtil.getSetStage().openSetStage();
+ SetStage.getInstance().openSetStage();
}
diff --git a/src/main/java/org/jcnc/jnotepad/root/RootBorderPane.java b/src/main/java/org/jcnc/jnotepad/root/RootBorderPane.java
index 62ea0ee..1cb4fb9 100644
--- a/src/main/java/org/jcnc/jnotepad/root/RootBorderPane.java
+++ b/src/main/java/org/jcnc/jnotepad/root/RootBorderPane.java
@@ -9,6 +9,7 @@ import org.jcnc.jnotepad.ui.module.AbstractBorderPane;
/**
* 根舞台下的Root主布局
+ *
* @author 许轲
*/
public class RootBorderPane extends AbstractBorderPane {
@@ -19,6 +20,10 @@ public class RootBorderPane extends AbstractBorderPane {
initRootBorderPane();
}
+ public static RootBorderPane getInstance() {
+ return INSTANCE;
+ }
+
private void initRootBorderPane() {
//中间,用于显示Main主布局
setCenterComponent(MainBorderPane.getInstance());
@@ -31,10 +36,6 @@ public class RootBorderPane extends AbstractBorderPane {
//主布局的下面
setBottomComponent(RootBottomSideBarVBox.getInstance());
}
-
- public static RootBorderPane getInstance() {
- return INSTANCE;
- }
}
diff --git a/src/main/java/org/jcnc/jnotepad/root/bottom/RootBottomSideBarVBox.java b/src/main/java/org/jcnc/jnotepad/root/bottom/RootBottomSideBarVBox.java
index 8a02199..bb57713 100644
--- a/src/main/java/org/jcnc/jnotepad/root/bottom/RootBottomSideBarVBox.java
+++ b/src/main/java/org/jcnc/jnotepad/root/bottom/RootBottomSideBarVBox.java
@@ -11,11 +11,11 @@ public class RootBottomSideBarVBox extends AbstractVBox {
initSidebarVBox();
}
- private void initSidebarVBox() {
- getChildren().addAll(JNotepadStatusBox.getInstance());
- }
-
public static RootBottomSideBarVBox getInstance() {
return INSTANCE;
}
+
+ private void initSidebarVBox() {
+ getChildren().addAll(JNotepadStatusBox.getInstance());
+ }
}
diff --git a/src/main/java/org/jcnc/jnotepad/root/center/main/MainBorderPane.java b/src/main/java/org/jcnc/jnotepad/root/center/main/MainBorderPane.java
index 8d679a7..8525402 100644
--- a/src/main/java/org/jcnc/jnotepad/root/center/main/MainBorderPane.java
+++ b/src/main/java/org/jcnc/jnotepad/root/center/main/MainBorderPane.java
@@ -16,15 +16,15 @@ public class MainBorderPane extends AbstractBorderPane {
initRootBorderPane();
}
+ public static MainBorderPane getInstance() {
+ return INSTANCE;
+ }
+
private void initRootBorderPane() {
//文本框
setCenterComponent(JNotepadTabPane.getInstance());
}
-
- public static MainBorderPane getInstance() {
- return INSTANCE;
- }
}
diff --git a/src/main/java/org/jcnc/jnotepad/root/center/main/center/tab/JNotepadTab.java b/src/main/java/org/jcnc/jnotepad/root/center/main/center/tab/JNotepadTab.java
index 00e7c0f..2d3007e 100644
--- a/src/main/java/org/jcnc/jnotepad/root/center/main/center/tab/JNotepadTab.java
+++ b/src/main/java/org/jcnc/jnotepad/root/center/main/center/tab/JNotepadTab.java
@@ -80,6 +80,7 @@ public class JNotepadTab extends Tab {
/**
* 保存为指定文件
+ *
* @param file 新文件
*/
public void save(File file) {
diff --git a/src/main/java/org/jcnc/jnotepad/root/center/main/center/tab/JNotepadTabPane.java b/src/main/java/org/jcnc/jnotepad/root/center/main/center/tab/JNotepadTabPane.java
index df2e03e..ff8f613 100644
--- a/src/main/java/org/jcnc/jnotepad/root/center/main/center/tab/JNotepadTabPane.java
+++ b/src/main/java/org/jcnc/jnotepad/root/center/main/center/tab/JNotepadTabPane.java
@@ -1,8 +1,9 @@
package org.jcnc.jnotepad.root.center.main.center.tab;
import javafx.scene.control.TabPane;
+import org.jcnc.jnotepad.root.center.main.bottom.status.JNotepadStatusBox;
+import org.jcnc.jnotepad.root.top.menu.JNotepadMenuBar;
import org.jcnc.jnotepad.tool.SingletonUtil;
-import org.jcnc.jnotepad.tool.UiUtil;
/**
* 标签页布局组件封装。
@@ -30,10 +31,10 @@ public class JNotepadTabPane extends TabPane {
(ov, from, to) -> {
if (to != null) {
// 更新菜单栏中与tab相关设置
- UiUtil.getMenuBar().updateMenuStatusBySelectedTab();
+ JNotepadMenuBar.getInstance().updateMenuStatusBySelectedTab();
}
// 更新状态标签
- UiUtil.getStatusBox().updateWhenTabSelected();
+ JNotepadStatusBox.getInstance().updateWhenTabSelected();
}
);
}
@@ -71,6 +72,6 @@ public class JNotepadTabPane extends TabPane {
public void fireTabSelected() {
JNotepadTab selectedTab = getSelected();
selectedTab.setAutoLine(SingletonUtil.getAppConfigController().getAutoLineConfig());
- UiUtil.getStatusBox().updateWhenTabSelected();
+ JNotepadStatusBox.getInstance().updateWhenTabSelected();
}
}
diff --git a/src/main/java/org/jcnc/jnotepad/root/right/RootRightSideBarVBox.java b/src/main/java/org/jcnc/jnotepad/root/right/RootRightSideBarVBox.java
index 72426fc..d4e34c1 100644
--- a/src/main/java/org/jcnc/jnotepad/root/right/RootRightSideBarVBox.java
+++ b/src/main/java/org/jcnc/jnotepad/root/right/RootRightSideBarVBox.java
@@ -10,11 +10,11 @@ public class RootRightSideBarVBox extends AbstractVBox {
initSidebarVBox();
}
- private void initSidebarVBox() {
-
- }
-
public static RootRightSideBarVBox getInstance() {
return INSTANCE;
}
+
+ private void initSidebarVBox() {
+
+ }
}
diff --git a/src/main/java/org/jcnc/jnotepad/root/top/RootTopBorderPane.java b/src/main/java/org/jcnc/jnotepad/root/top/RootTopBorderPane.java
index 9ef19dd..7e8bd80 100644
--- a/src/main/java/org/jcnc/jnotepad/root/top/RootTopBorderPane.java
+++ b/src/main/java/org/jcnc/jnotepad/root/top/RootTopBorderPane.java
@@ -17,14 +17,14 @@ public class RootTopBorderPane extends AbstractBorderPane {
initRootBorderPane();
}
+ public static RootTopBorderPane getInstance() {
+ return INSTANCE;
+ }
+
private void initRootBorderPane() {
//文本框上面
setTopComponent(JNotepadMenuBar.getInstance());
}
-
- public static RootTopBorderPane getInstance() {
- return INSTANCE;
- }
}
diff --git a/src/main/java/org/jcnc/jnotepad/tool/SingletonUtil.java b/src/main/java/org/jcnc/jnotepad/tool/SingletonUtil.java
index 22e1a7d..ee986bb 100644
--- a/src/main/java/org/jcnc/jnotepad/tool/SingletonUtil.java
+++ b/src/main/java/org/jcnc/jnotepad/tool/SingletonUtil.java
@@ -52,7 +52,7 @@ public class SingletonUtil {
}
/**
- * 获取UI资源绑定组件I
+ * 获取UI资源绑定组件
*
* @return org.jcnc.jnotepad.app.i18n.UiResourceBundle
* @since 2023/8/30 12:45
diff --git a/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java b/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java
index b114473..bd4caef 100644
--- a/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java
+++ b/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java
@@ -2,61 +2,25 @@ package org.jcnc.jnotepad.tool;
import javafx.scene.image.Image;
import javafx.stage.Window;
+import org.jcnc.jnotepad.LunchApp;
import org.jcnc.jnotepad.constants.AppConstants;
-import org.jcnc.jnotepad.root.center.main.bottom.status.JNotepadStatusBox;
-import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTab;
-import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTabPane;
-import org.jcnc.jnotepad.root.top.menu.JNotepadMenuBar;
-import org.jcnc.jnotepad.ui.setStage.SetStage;
-import org.jcnc.jnotepad.view.manager.ViewManager;
import java.util.Objects;
/**
- * UI工具
- * 封装了项目所有的UI组件,以减少组件单例模式造成代码的复杂性
+ * UI工具
*
* @author gewuyou
*/
public class UiUtil {
- /**
- * 标签页布局组件
- */
- private static final JNotepadTabPane TAB_PANE = JNotepadTabPane.getInstance();
- /**
- * 视图管理组件
- */
- private static final ViewManager VIEW_MANAGER = ViewManager.getInstance();
- /**
- * 状态栏组件
- */
- private static final JNotepadStatusBox STATUS_BOX = JNotepadStatusBox.getInstance();
- /**
- * 菜单栏组件
- */
- private static final JNotepadMenuBar MENU_BAR = JNotepadMenuBar.getInstance();
/**
* 应用程序图标
*/
private static final Image ICON = new Image(Objects.requireNonNull(UiUtil.class.getResource(AppConstants.APP_ICON)).toString());
- /**
- * 设置窗口
- */
- private static final SetStage SET_STAGE = SetStage.getInstance();
private UiUtil() {
}
- /**
- * 获取设置窗口
- *
- * @return org.jcnc.jnotepad.ui.setStage.SetStage
- * @since 2023/8/30 12:39
- */
- public static SetStage getSetStage() {
- return SET_STAGE;
- }
-
/**
* 获取应用程序图标
*
@@ -67,30 +31,6 @@ public class UiUtil {
return ICON;
}
- /**
- * 获取标签页布局组件
- *
- * @return org.jcnc.jnotepad.ui.root.center.tab.JNotepadTabPane
- * @apiNote JNotepadTabPane.getInstance()
- * @see JNotepadTabPane
- */
-
- public static JNotepadTabPane getJnotepadTabPane() {
- return TAB_PANE;
- }
-
- /**
- * 获取标签页组件
- *
- * @return org.jcnc.jnotepad.ui.root.center.tab.JNotepadTab
- * @apiNote JNotepadTabPane.getInstance().getSelected()
获取当前选中的标签页
- * @see JNotepadTabPane
- */
-
- public static JNotepadTab getJnotepadtab() {
- return TAB_PANE.getSelected();
- }
-
/**
* 获取应用窗口
*
@@ -99,37 +39,6 @@ public class UiUtil {
* @since 2023/8/29 14:12
*/
public static Window getAppWindow() {
- return TAB_PANE.getSelected().getTabPane().getScene().getWindow();
- }
-
- /**
- * 获取视图管理组件
- *
- * @return org.jcnc.jnotepad.view.manager.ViewManager
- * @apiNote ViewManager.getInstance()
- * @since 2023/8/29 14:13
- */
- public static ViewManager getViewManager() {
- return VIEW_MANAGER;
- }
-
- /**
- * 获取状态栏组件
- *
- * @return org.jcnc.jnotepad.ui.root.bottom.status.JNotepadStatusBox
- * @since 2023/8/29 14:14
- */
- public static JNotepadStatusBox getStatusBox() {
- return STATUS_BOX;
- }
-
- /**
- * 获取菜单栏组件
- *
- * @return org.jcnc.jnotepad.ui.root.top.menu.JNotepadMenuBar
- * @since 2023/8/29 14:15
- */
- public static JNotepadMenuBar getMenuBar() {
- return MENU_BAR;
+ return LunchApp.getWindow();
}
}
diff --git a/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/impl/TextFileChooserFactory.java b/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/impl/TextFileChooserFactory.java
index c072569..dbe126f 100644
--- a/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/impl/TextFileChooserFactory.java
+++ b/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/impl/TextFileChooserFactory.java
@@ -13,12 +13,12 @@ import java.io.File;
*/
public class TextFileChooserFactory implements FileChooserFactory {
+ private static final TextFileChooserFactory INSTANCE = new TextFileChooserFactory();
+
private TextFileChooserFactory() {
}
- private static final TextFileChooserFactory INSTANCE = new TextFileChooserFactory();
-
public static TextFileChooserFactory getInstance() {
return INSTANCE;
}
diff --git a/src/main/java/org/jcnc/jnotepad/ui/module/LineNumberTextArea.java b/src/main/java/org/jcnc/jnotepad/ui/module/LineNumberTextArea.java
index cfe2d63..fbb47a0 100644
--- a/src/main/java/org/jcnc/jnotepad/ui/module/LineNumberTextArea.java
+++ b/src/main/java/org/jcnc/jnotepad/ui/module/LineNumberTextArea.java
@@ -3,10 +3,11 @@ package org.jcnc.jnotepad.ui.module;
import javafx.beans.property.StringProperty;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
+import org.jcnc.jnotepad.root.center.main.bottom.status.JNotepadStatusBox;
import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTab;
+import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTabPane;
import org.jcnc.jnotepad.tool.LogUtil;
import org.jcnc.jnotepad.tool.SingletonUtil;
-import org.jcnc.jnotepad.tool.UiUtil;
import org.slf4j.Logger;
import java.io.BufferedWriter;
@@ -19,9 +20,9 @@ import java.io.IOException;
*/
public class LineNumberTextArea extends BorderPane {
- private static final Logger logger=LogUtil.getLogger(LineNumberTextArea.class);
static final int[] SIZE_TABLE = {9, 99, 999, 9999, 99999, 999999, 9999999,
99999999, 999999999, Integer.MAX_VALUE};
+ private static final Logger logger = LogUtil.getLogger(LineNumberTextArea.class);
private static final int MIN_LINE_NUMBER_WIDTH = 30;
private final TextArea mainTextArea;
private final TextArea lineNumberArea;
@@ -59,12 +60,12 @@ public class LineNumberTextArea extends BorderPane {
lineNumberArea.textProperty().addListener((observable, oldValue, newValue) -> updateLineNumberWidth());
- this.mainTextArea.caretPositionProperty().addListener((caretObservable, oldPosition, newPosition) -> UiUtil.getStatusBox().updateWordCountStatusLabel());
+ this.mainTextArea.caretPositionProperty().addListener((caretObservable, oldPosition, newPosition) -> JNotepadStatusBox.getInstance().updateWordCountStatusLabel());
this.textProperty().addListener((observable, oldValue, newValue) -> {
// 更新行号
updateLineNumberArea();
// 更新状态栏
- UiUtil.getStatusBox().updateWordCountStatusLabel();
+ JNotepadStatusBox.getInstance().updateWordCountStatusLabel();
// 自动保存
save();
});
@@ -74,7 +75,7 @@ public class LineNumberTextArea extends BorderPane {
* 以原文件编码格式写回文件
*/
public void save() {
- JNotepadTab tab = UiUtil.getJnotepadtab();
+ JNotepadTab tab = JNotepadTabPane.getInstance().getSelected();
if (tab == null) {
return;
}
diff --git a/tool/package.md b/tool/package.md
index ddba997..112b99c 100644
--- a/tool/package.md
+++ b/tool/package.md
@@ -1,30 +1,41 @@
# 打包
+
## 准备
+
1. 下载maven 3.8.8, [Download](https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.zip)
2. 下载GraalVM。在[GraalVM下载页](https://www.graalvm.org/downloads/#)选择Java17,操作系统后,点击Download下载。
# Windows下基于GraalVM的打包
+
## 配置maven和GraalVM
+
1. 将下载的压缩包解压到目录,例如:d:\tools\maven,D:\tools\graalvm-17\graalvm-jdk-17.0.8+9.1
2. 配置环境变量
+
```
GRAALVM_HOME=D:\tools\graalvm-17\graalvm-jdk-17.0.8+9.1
M2_HOME=d:\tools\maven
```
+

+
3. 配置PATH环境变量
-
+ 
4. 安装visual studio build tools
-安装说明:https://www.graalvm.org/latest/docs/getting-started/windows/
-a) 下载安装程序:https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16
-b) 参考网页中的安装步骤
+ 安装说明:https://www.graalvm.org/latest/docs/getting-started/windows/
+ a) 下载安装程序:https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16
+ b) 参考网页中的安装步骤
5. 验证安装成功
-使用下面命令启动编译环境
+ 使用下面命令启动编译环境
+
```
cmd.exe /k F:\vs\ide\VC\Auxiliary\Build\vcvars64.bat
```
+
需要把F:\vs\ide替换为本地的visual stuido安装路径。
+
6. 进入项目tool目录,执行build.bat进行打包,生成可执行文件。
+
```
build.bat
```
\ No newline at end of file