From e1a058d89152fa4380f44d1f0518e63f345d26fc Mon Sep 17 00:00:00 2001
From: gewuyou <1063891901@qq.com>
Date: Wed, 30 Aug 2023 12:31:52 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20=E4=BC=98=E5=8C=96?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../org/jcnc/jnotepad/Interface/VBoxAble.java | 1 -
src/main/java/org/jcnc/jnotepad/LunchApp.java | 5 ++-
.../controller/event/handler/tool/SetBtn.java | 10 ------
.../java/org/jcnc/jnotepad/tool/UiUtil.java | 20 ++++++++++-
.../jnotepad/ui/root/top/tools/ToolHBox.java | 2 --
.../jcnc/jnotepad/ui/setStage/SetStage.java | 33 +++++++++++--------
.../jnotepad/view/manager/ViewManager.java | 2 +-
7 files changed, 42 insertions(+), 31 deletions(-)
diff --git a/src/main/java/org/jcnc/jnotepad/Interface/VBoxAble.java b/src/main/java/org/jcnc/jnotepad/Interface/VBoxAble.java
index 0d94912..88bc9ab 100644
--- a/src/main/java/org/jcnc/jnotepad/Interface/VBoxAble.java
+++ b/src/main/java/org/jcnc/jnotepad/Interface/VBoxAble.java
@@ -1,7 +1,6 @@
package org.jcnc.jnotepad.Interface;
import javafx.scene.Node;
-import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
public interface VBoxAble {
diff --git a/src/main/java/org/jcnc/jnotepad/LunchApp.java b/src/main/java/org/jcnc/jnotepad/LunchApp.java
index 089b152..984a657 100644
--- a/src/main/java/org/jcnc/jnotepad/LunchApp.java
+++ b/src/main/java/org/jcnc/jnotepad/LunchApp.java
@@ -4,7 +4,6 @@ package org.jcnc.jnotepad;
import atlantafx.base.theme.PrimerLight;
import javafx.application.Application;
import javafx.scene.Scene;
-import javafx.scene.image.Image;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import org.jcnc.jnotepad.app.i18n.UIResourceBundle;
@@ -13,6 +12,7 @@ import org.jcnc.jnotepad.constants.TextConstants;
import org.jcnc.jnotepad.controller.i18n.LocalizationController;
import org.jcnc.jnotepad.controller.manager.Controller;
import org.jcnc.jnotepad.manager.ThreadPoolManager;
+import org.jcnc.jnotepad.tool.UiUtil;
import org.jcnc.jnotepad.view.manager.ViewManager;
import java.util.List;
@@ -38,7 +38,6 @@ public class LunchApp extends Application {
Pane root = new Pane();
double width = AppConstants.SCREEN_WIDTH;
double length = AppConstants.SCREEN_LENGTH;
- String icon = AppConstants.APP_ICON;
scene = new Scene(root, width, length);
Application.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet());
scene.getStylesheets().add(Objects.requireNonNull(getClass().getResource("/css/styles.css")).toExternalForm());
@@ -47,7 +46,7 @@ public class LunchApp extends Application {
primaryStage.setWidth(width);
primaryStage.setHeight(length);
primaryStage.setScene(scene);
- primaryStage.getIcons().add(new Image(Objects.requireNonNull(getClass().getResource(icon)).toString()));
+ primaryStage.getIcons().add(UiUtil.getIcon());
primaryStage.show();
}
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 035b2f8..37b7e50 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,17 +2,7 @@ package org.jcnc.jnotepad.controller.event.handler.tool;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
-import javafx.scene.Scene;
-import javafx.scene.control.Label;
-import javafx.scene.layout.VBox;
-import javafx.stage.Stage;
-import org.jcnc.jnotepad.app.i18n.UIResourceBundle;
-import org.jcnc.jnotepad.constants.TextConstants;
-import org.jcnc.jnotepad.tool.UiUtil;
-import org.jcnc.jnotepad.ui.module.LineNumberTextArea;
-import org.jcnc.jnotepad.ui.root.center.tab.JNotepadTab;
import org.jcnc.jnotepad.ui.setStage.SetStage;
-import org.jcnc.jnotepad.view.manager.ViewManager;
/**
diff --git a/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java b/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java
index 41f15fd..caee381 100644
--- a/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java
+++ b/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java
@@ -1,12 +1,16 @@
package org.jcnc.jnotepad.tool;
+import javafx.scene.image.Image;
import javafx.stage.Window;
-import org.jcnc.jnotepad.ui.root.top.menu.JNotepadMenuBar;
+import org.jcnc.jnotepad.constants.AppConstants;
import org.jcnc.jnotepad.ui.root.bottom.status.JNotepadStatusBox;
import org.jcnc.jnotepad.ui.root.center.tab.JNotepadTab;
import org.jcnc.jnotepad.ui.root.center.tab.JNotepadTabPane;
+import org.jcnc.jnotepad.ui.root.top.menu.JNotepadMenuBar;
import org.jcnc.jnotepad.view.manager.ViewManager;
+import java.util.Objects;
+
/**
* UI工具
* 封装了项目所有的UI组件,以减少组件单例模式造成代码的复杂性
@@ -33,6 +37,20 @@ public class UiUtil {
* 菜单栏组件
*/
private static final JNotepadMenuBar MENU_BAR = JNotepadMenuBar.getInstance();
+ /**
+ * 应用程序图标
+ */
+ private static final Image ICON = new Image(Objects.requireNonNull(UiUtil.class.getResource(AppConstants.APP_ICON)).toString());
+
+ /**
+ * 获取应用程序图标
+ *
+ * @return javafx.scene.image.Image
+ * @since 2023/8/30 11:03
+ */
+ public static Image getIcon() {
+ return ICON;
+ }
/**
* 获取标签页布局组件
diff --git a/src/main/java/org/jcnc/jnotepad/ui/root/top/tools/ToolHBox.java b/src/main/java/org/jcnc/jnotepad/ui/root/top/tools/ToolHBox.java
index d6ac4c4..96df3b4 100644
--- a/src/main/java/org/jcnc/jnotepad/ui/root/top/tools/ToolHBox.java
+++ b/src/main/java/org/jcnc/jnotepad/ui/root/top/tools/ToolHBox.java
@@ -1,7 +1,5 @@
package org.jcnc.jnotepad.ui.root.top.tools;
-import javafx.geometry.Pos;
-import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
diff --git a/src/main/java/org/jcnc/jnotepad/ui/setStage/SetStage.java b/src/main/java/org/jcnc/jnotepad/ui/setStage/SetStage.java
index ca0d4f4..7c8512e 100644
--- a/src/main/java/org/jcnc/jnotepad/ui/setStage/SetStage.java
+++ b/src/main/java/org/jcnc/jnotepad/ui/setStage/SetStage.java
@@ -1,18 +1,25 @@
package org.jcnc.jnotepad.ui.setStage;
-import javafx.geometry.Insets;
import javafx.scene.Scene;
-import javafx.scene.control.*;
-import javafx.scene.layout.GridPane;
-import javafx.scene.layout.HBox;
+import javafx.scene.control.Label;
+import javafx.scene.control.ListView;
+import javafx.scene.control.SplitPane;
+import javafx.scene.control.TitledPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
+import org.jcnc.jnotepad.tool.UiUtil;
+/**
+ * @author 许轲
+ */
public class SetStage {
private static final SetStage SET_STAGE = new SetStage();
- private StackPane contentDisplay; // Declare contentDisplay as a class member
+ /**
+ * Declare contentDisplay as a class member
+ */
+ private StackPane contentDisplay;
public static SetStage getInstance() {
return SET_STAGE;
@@ -57,16 +64,17 @@ public class SetStage {
titledPaneContainer.getChildren().addAll(generalPane, appearancePane, securityPane);
// 创建一个占位符,用于显示右侧内容区域
- StackPane contentDisplay = new StackPane(new Label("从左侧选择设置以显示内容"));
+ StackPane stackPane = new StackPane(new Label("从左侧选择设置以显示内容"));
// 设置 TitledPanes 的点击事件监听器
- generalPane.setOnMouseClicked(event -> contentDisplay.getChildren().setAll(new Label("常规设置内容")));
- appearancePane.setOnMouseClicked(event -> contentDisplay.getChildren().setAll(new Label("外观设置内容")));
- securityPane.setOnMouseClicked(event -> contentDisplay.getChildren().setAll(new Label("安全设置内容")));
+ generalPane.setOnMouseClicked(event -> stackPane.getChildren().setAll(new Label("常规设置内容")));
+ appearancePane.setOnMouseClicked(event -> stackPane.getChildren().setAll(new Label("外观设置内容")));
+ securityPane.setOnMouseClicked(event -> stackPane.getChildren().setAll(new Label("安全设置内容")));
// 创建一个水平分割面板来容纳整个布局
- SplitPane splitPane = new SplitPane(titledPaneContainer, contentDisplay);
- splitPane.setDividerPositions(0.3); // 设置分隔条位置
+ SplitPane splitPane = new SplitPane(titledPaneContainer, stackPane);
+ // 设置分隔条位置
+ splitPane.setDividerPositions(0.3);
// 创建场景
Scene scene = new Scene(splitPane, 800, 600);
@@ -74,6 +82,7 @@ public class SetStage {
// 设置场景并显示窗口
setStage.setScene(scene);
setStage.setTitle("设置窗口");
+ setStage.getIcons().add(UiUtil.getIcon());
setStage.show();
}
@@ -87,10 +96,8 @@ public class SetStage {
contentDisplay.getChildren().setAll(new Label(selectedItem + " 的设置内容"));
}
});
-
return listView;
}
-
}
diff --git a/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java b/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java
index 7a16a3c..b536773 100644
--- a/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java
+++ b/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java
@@ -3,9 +3,9 @@ package org.jcnc.jnotepad.view.manager;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import org.jcnc.jnotepad.exception.AppException;
-import org.jcnc.jnotepad.ui.root.top.RootTopVBox;
import org.jcnc.jnotepad.ui.root.bottom.status.JNotepadStatusBox;
import org.jcnc.jnotepad.ui.root.center.tab.JNotepadTabPane;
+import org.jcnc.jnotepad.ui.root.top.RootTopVBox;
/**
From 3a8b939cbe621ff3a2e4a8e62c14e30686ec2217 Mon Sep 17 00:00:00 2001
From: gewuyou <1063891901@qq.com>
Date: Wed, 30 Aug 2023 13:38:04 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20=E4=BC=98=E5=8C=96?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/main/java/module-info.java | 20 ++--
.../org/jcnc/jnotepad/Interface/HBoxAble.java | 1 +
src/main/java/org/jcnc/jnotepad/LunchApp.java | 17 ++--
.../jcnc/jnotepad/app/config/AppConfig.java | 95 +++++++++----------
...ourceBundle.java => UiResourceBundle.java} | 60 ++++++------
.../jcnc/jnotepad/constants/AppConstants.java | 6 +-
.../jnotepad/constants/TextConstants.java | 12 +--
.../config/AppConfigController.java | 16 ++--
.../event/handler/menuBar/NewFile.java | 4 +-
.../event/handler/menuBar/OpenConfig.java | 4 +-
.../event/handler/menuBar/SaveFile.java | 4 +-
.../controller/event/handler/tool/SetBtn.java | 4 +-
.../i18n/LocalizationController.java | 35 ++++---
.../jnotepad/manager/ThreadPoolManager.java | 29 +++---
.../jcnc/jnotepad/tool/EncodingDetector.java | 2 +-
.../java/org/jcnc/jnotepad/tool/JsonUtil.java | 6 +-
.../org/jcnc/jnotepad/tool/SingletonUtil.java | 63 ++++++++++++
.../java/org/jcnc/jnotepad/tool/UiUtil.java | 21 +++-
.../ui/module/LineNumberTextArea.java | 19 ++--
.../root/bottom/status/JNotepadStatusBox.java | 24 +++--
.../ui/root/center/tab/JNotepadTab.java | 19 ++--
.../ui/root/center/tab/JNotepadTabPane.java | 8 +-
.../ui/root/top/menu/JNotepadMenuBar.java | 74 +++++++--------
.../ui/root/top/tools/JNotepadToolBar.java | 8 +-
.../jnotepad/ui/root/top/tools/ToolHBox.java | 2 -
.../jcnc/jnotepad/ui/setStage/SetStage.java | 22 +++--
.../jnotepad/view/manager/ViewManager.java | 28 +++---
src/main/resources/img/icon.svg | 7 +-
28 files changed, 334 insertions(+), 276 deletions(-)
rename src/main/java/org/jcnc/jnotepad/app/i18n/{UIResourceBundle.java => UiResourceBundle.java} (93%)
create mode 100644 src/main/java/org/jcnc/jnotepad/tool/SingletonUtil.java
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 9d88868..b867622 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -12,20 +12,24 @@ module org.jcnc.jnotepad {
requires ch.qos.logback.core;
requires ch.qos.logback.classic;
requires com.ibm.icu;
- exports org.jcnc.jnotepad.app.config;
exports org.jcnc.jnotepad;
+ exports org.jcnc.jnotepad.app.config;
+ exports org.jcnc.jnotepad.app.i18n;
+ exports org.jcnc.jnotepad.constants;
+ exports org.jcnc.jnotepad.controller.config;
+ exports org.jcnc.jnotepad.controller.manager;
+ exports org.jcnc.jnotepad.controller.i18n;
+ exports org.jcnc.jnotepad.controller.event.handler.tool;
+ exports org.jcnc.jnotepad.controller.event.handler.menuBar;
exports org.jcnc.jnotepad.tool;
exports org.jcnc.jnotepad.Interface;
- exports org.jcnc.jnotepad.controller.manager;
- exports org.jcnc.jnotepad.view.manager;
- exports org.jcnc.jnotepad.constants;
- exports org.jcnc.jnotepad.controller.i18n;
exports org.jcnc.jnotepad.ui.root.center.tab;
exports org.jcnc.jnotepad.ui.root.bottom.status;
exports org.jcnc.jnotepad.ui.root.top.menu;
- opens org.jcnc.jnotepad.app.config;
exports org.jcnc.jnotepad.ui.module;
+ exports org.jcnc.jnotepad.ui.setStage;
exports org.jcnc.jnotepad.ui.root.top.tools;
- exports org.jcnc.jnotepad.controller.event.handler.tool;
- exports org.jcnc.jnotepad.controller.event.handler.menuBar;
+ exports org.jcnc.jnotepad.view.manager;
+ opens org.jcnc.jnotepad.app.config;
+
}
\ No newline at end of file
diff --git a/src/main/java/org/jcnc/jnotepad/Interface/HBoxAble.java b/src/main/java/org/jcnc/jnotepad/Interface/HBoxAble.java
index 8bdf62b..2eb7826 100644
--- a/src/main/java/org/jcnc/jnotepad/Interface/HBoxAble.java
+++ b/src/main/java/org/jcnc/jnotepad/Interface/HBoxAble.java
@@ -8,5 +8,6 @@ public interface HBoxAble {
void addChild(Node node);
void addChild(Node... nodes);
+
HBox getHBox();
}
diff --git a/src/main/java/org/jcnc/jnotepad/LunchApp.java b/src/main/java/org/jcnc/jnotepad/LunchApp.java
index 984a657..f931eda 100644
--- a/src/main/java/org/jcnc/jnotepad/LunchApp.java
+++ b/src/main/java/org/jcnc/jnotepad/LunchApp.java
@@ -6,12 +6,12 @@ import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
-import org.jcnc.jnotepad.app.i18n.UIResourceBundle;
+import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.constants.AppConstants;
import org.jcnc.jnotepad.constants.TextConstants;
import org.jcnc.jnotepad.controller.i18n.LocalizationController;
-import org.jcnc.jnotepad.controller.manager.Controller;
import org.jcnc.jnotepad.manager.ThreadPoolManager;
+import org.jcnc.jnotepad.tool.SingletonUtil;
import org.jcnc.jnotepad.tool.UiUtil;
import org.jcnc.jnotepad.view.manager.ViewManager;
@@ -30,9 +30,12 @@ public class LunchApp extends Application {
* 线程池
*/
private final ExecutorService threadPool = ThreadPoolManager.getThreadPool();
- Controller controller = Controller.getInstance();
Scene scene;
+ public static void main(String[] args) {
+ launch(args);
+ }
+
@Override
public void start(Stage primaryStage) {
Pane root = new Pane();
@@ -42,7 +45,7 @@ public class LunchApp extends Application {
Application.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet());
scene.getStylesheets().add(Objects.requireNonNull(getClass().getResource("/css/styles.css")).toExternalForm());
initUiComponents();
- UIResourceBundle.bindStringProperty(primaryStage.titleProperty(), TextConstants.TITLE);
+ UiResourceBundle.bindStringProperty(primaryStage.titleProperty(), TextConstants.TITLE);
primaryStage.setWidth(width);
primaryStage.setHeight(length);
primaryStage.setScene(scene);
@@ -61,7 +64,7 @@ public class LunchApp extends Application {
// 使用线程池加载关联文件并创建文本区域
List rawParameters = getParameters().getRaw();
- controller.openAssociatedFileAndCreateTextArea(rawParameters);
+ SingletonUtil.getController().openAssociatedFileAndCreateTextArea(rawParameters);
}
@Override
@@ -70,8 +73,4 @@ public class LunchApp extends Application {
threadPool.shutdownNow();
}
- public static void main(String[] args) {
- launch(args);
- }
-
}
diff --git a/src/main/java/org/jcnc/jnotepad/app/config/AppConfig.java b/src/main/java/org/jcnc/jnotepad/app/config/AppConfig.java
index 677f3b7..05938af 100644
--- a/src/main/java/org/jcnc/jnotepad/app/config/AppConfig.java
+++ b/src/main/java/org/jcnc/jnotepad/app/config/AppConfig.java
@@ -5,64 +5,23 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.ArrayList;
import java.util.List;
+import static org.jcnc.jnotepad.constants.TextConstants.CHINESE;
+
/**
* 数据模型类,用于表示 MyData 对象的数据结构。
*
* @author 许轲
*/
public class AppConfig {
- private String language;
-
- @JsonIgnore
- private boolean textWrap;
-
- private List shortcutKey;
-
- /**
- * ShortcutKey 类,用于表示快捷键信息。
- */
- public static class ShortcutKey {
- private String buttonName;
- private String shortcutKeyValue;
-
- public String getButtonName() {
- return buttonName;
- }
-
- public void setButtonName(String buttonName) {
- this.buttonName = buttonName;
- }
-
- public String getShortcutKeyValue() {
- return shortcutKeyValue;
- }
-
- public void setShortcutKeyValue(String shortcutKeyValue) {
- this.shortcutKeyValue = shortcutKeyValue;
- }
- }
-
- public String getLanguage() {
- return language;
- }
-
- public void setLanguage(String language) {
- this.language = language;
- }
-
- public List getShortcutKey() {
- return shortcutKey;
- }
-
- public void setShortcutKey(List shortcutKey) {
- this.shortcutKey = shortcutKey;
- }
-
private static final String CTRL_N = "ctrl+n";
private static final String CTRL_O = "ctrl+o";
private static final String CTRL_S = "ctrl+s";
private static final String CTRL_ALT_S = "ctrl+alt+s";
private static final String ALT_S = "alt+s";
+ private String language;
+ @JsonIgnore
+ private boolean textWrap;
+ private List shortcutKey;
/**
* 生成默认应用配置对象。
@@ -71,7 +30,7 @@ public class AppConfig {
*/
public static AppConfig generateDefaultAppConfig() {
AppConfig myData = new AppConfig();
- myData.setLanguage("chinese");
+ myData.setLanguage(CHINESE);
myData.setTextWrap(false);
List shortcutKeys = new ArrayList<>();
@@ -102,6 +61,22 @@ public class AppConfig {
return shortcutKey;
}
+ public String getLanguage() {
+ return language;
+ }
+
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+
+ public List getShortcutKey() {
+ return shortcutKey;
+ }
+
+ public void setShortcutKey(List shortcutKey) {
+ this.shortcutKey = shortcutKey;
+ }
+
public boolean isTextWrap() {
return textWrap;
}
@@ -109,4 +84,28 @@ public class AppConfig {
public void setTextWrap(boolean textWrap) {
this.textWrap = textWrap;
}
+
+ /**
+ * ShortcutKey 类,用于表示快捷键信息。
+ */
+ public static class ShortcutKey {
+ private String buttonName;
+ private String shortcutKeyValue;
+
+ public String getButtonName() {
+ return buttonName;
+ }
+
+ public void setButtonName(String buttonName) {
+ this.buttonName = buttonName;
+ }
+
+ public String getShortcutKeyValue() {
+ return shortcutKeyValue;
+ }
+
+ public void setShortcutKeyValue(String shortcutKeyValue) {
+ this.shortcutKeyValue = shortcutKeyValue;
+ }
+ }
}
diff --git a/src/main/java/org/jcnc/jnotepad/app/i18n/UIResourceBundle.java b/src/main/java/org/jcnc/jnotepad/app/i18n/UiResourceBundle.java
similarity index 93%
rename from src/main/java/org/jcnc/jnotepad/app/i18n/UIResourceBundle.java
rename to src/main/java/org/jcnc/jnotepad/app/i18n/UiResourceBundle.java
index a0ec173..945f872 100644
--- a/src/main/java/org/jcnc/jnotepad/app/i18n/UIResourceBundle.java
+++ b/src/main/java/org/jcnc/jnotepad/app/i18n/UiResourceBundle.java
@@ -15,31 +15,52 @@ import java.util.ResourceBundle;
*
* @author songdragon
*/
-public class UIResourceBundle {
+public class UiResourceBundle {
- private static final UIResourceBundle INSTANCE = new UIResourceBundle();
+ private static final UiResourceBundle INSTANCE = new UiResourceBundle();
/**
* resource目录下的i18n/i18nXXX.properties
*/
private static final String BASENAME = "i18n/i18n";
-
+ /**
+ * 资源文件的观察者绑定。
+ */
+ private final ObjectProperty resources = new SimpleObjectProperty<>();
/**
* 当前语言
*/
private Locale currentLocale;
- public static UIResourceBundle getInstance() {
+ private UiResourceBundle() {
+
+ }
+
+ public static UiResourceBundle getInstance() {
return INSTANCE;
}
- private UIResourceBundle() {
-
+ /**
+ * 工具方法:绑定StringProperty和Key对应的内容
+ *
+ * @param stringProperty 字符串属性
+ * @param key 键值
+ */
+ public static void bindStringProperty(StringProperty stringProperty, String key) {
+ if (stringProperty == null) {
+ return;
+ }
+ stringProperty.bind(getInstance().getStringBinding(key));
}
/**
- * 资源文件的观察者绑定。
+ * 获取当前资源中的key值
+ *
+ * @param key 资源所对应键
+ * @return 当前键所对应的值
*/
- private final ObjectProperty resources = new SimpleObjectProperty<>();
+ public static String getContent(String key) {
+ return INSTANCE.getResources().getString(key);
+ }
/**
* 获取当前资源文件
@@ -81,29 +102,6 @@ public class UIResourceBundle {
return Bindings.createStringBinding(() -> getResources().getString(key), resourcesProperty());
}
- /**
- * 工具方法:绑定StringProperty和Key对应的内容
- *
- * @param stringProperty 字符串属性
- * @param key 键值
- */
- public static void bindStringProperty(StringProperty stringProperty, String key) {
- if (stringProperty == null) {
- return;
- }
- stringProperty.bind(getInstance().getStringBinding(key));
- }
-
- /**
- * 获取当前资源中的key值
- *
- * @param key 资源所对应键
- * @return 当前键所对应的值
- */
- public static String getContent(String key) {
- return INSTANCE.getResources().getString(key);
- }
-
/**
* 注册资源变更监听器
*
diff --git a/src/main/java/org/jcnc/jnotepad/constants/AppConstants.java b/src/main/java/org/jcnc/jnotepad/constants/AppConstants.java
index 7ef55e6..ade589f 100644
--- a/src/main/java/org/jcnc/jnotepad/constants/AppConstants.java
+++ b/src/main/java/org/jcnc/jnotepad/constants/AppConstants.java
@@ -7,9 +7,6 @@ package org.jcnc.jnotepad.constants;
*/
public class AppConstants {
- private AppConstants() {
- }
-
/**
* 初始宽度
*/
@@ -23,4 +20,7 @@ public class AppConstants {
*/
public static final String APP_ICON = "/img/icon.png";
+ private AppConstants() {
+ }
+
}
diff --git a/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java b/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java
index 176558f..61ba647 100644
--- a/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java
+++ b/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java
@@ -8,19 +8,15 @@ package org.jcnc.jnotepad.constants;
*/
public class TextConstants {
- private TextConstants() {
- }
+ public static final String TITLE = "title";
/// GlobalConfig文本常量
-
- public static final String TITLE = "title";
public static final String SAVE = "SAVE";
public static final String FILE = "FILE";
public static final String NEW = "NEW";
public static final String OPEN = "OPEN";
public static final String SAVE_AS = "SAVE_AS";
-
public static final String RENAME = "RENAME";
public static final String SET = "SET";
public static final String WORD_WRAP = "WORD_WRAP";
@@ -37,16 +33,18 @@ public class TextConstants {
public static final String COLUMN = "COLUMN";
public static final String WORD_COUNT = "WORD_COUNT";
public static final String ENCODE = "ENCODE";
-
- /// Config 文本常量
/**
* 英文小写
*/
public static final String ENGLISH = "english";
+ /// Config 文本常量
/**
* 中文小写
*/
public static final String CHINESE = "chinese";
+ private TextConstants() {
+ }
+
}
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 3b605f3..b9e11bc 100644
--- a/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java
+++ b/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java
@@ -22,27 +22,23 @@ import java.util.List;
*/
public class AppConfigController {
- private static final Logger logger = LogUtil.getLogger(AppConfigController.class);
-
- private static final AppConfigController INSTANCE = new AppConfigController();
-
- public static AppConfigController getInstance() {
- return INSTANCE;
- }
-
/**
* 配置文件名
*/
public static final String CONFIG_NAME = "jnotepadConfig.json";
-
+ private static final Logger logger = LogUtil.getLogger(AppConfigController.class);
+ 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();
}
+ public static AppConfigController getInstance() {
+ return INSTANCE;
+ }
+
/**
* 加载配置文件内容
*/
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 b4de320..7506996 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
@@ -2,7 +2,7 @@ package org.jcnc.jnotepad.controller.event.handler.menuBar;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
-import org.jcnc.jnotepad.app.i18n.UIResourceBundle;
+import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.constants.TextConstants;
import org.jcnc.jnotepad.tool.UiUtil;
import org.jcnc.jnotepad.ui.module.LineNumberTextArea;
@@ -36,7 +36,7 @@ public class NewFile implements EventHandler {
ViewManager viewManager = UiUtil.getViewManager();
// 创建标签页
JNotepadTab jNotepadTab = new JNotepadTab(
- UIResourceBundle.getContent(TextConstants.NEW_FILE)
+ UiResourceBundle.getContent(TextConstants.NEW_FILE)
+ viewManager.selfIncreaseAndGetTabIndex(),
textArea);
// 设置当前标签页与本地文件无关联
diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/OpenConfig.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/OpenConfig.java
index ec2e9e5..1c403db 100644
--- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/OpenConfig.java
+++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/OpenConfig.java
@@ -1,8 +1,8 @@
package org.jcnc.jnotepad.controller.event.handler.menuBar;
import javafx.event.ActionEvent;
-import org.jcnc.jnotepad.controller.config.AppConfigController;
import org.jcnc.jnotepad.tool.LogUtil;
+import org.jcnc.jnotepad.tool.SingletonUtil;
import java.io.File;
@@ -16,7 +16,7 @@ public class OpenConfig extends OpenFile {
@Override
public void handle(ActionEvent actionEvent) {
// 显示文件选择对话框,并获取配置文件
- File file = AppConfigController.getInstance().getConfigPath().toFile();
+ File file = SingletonUtil.getAppConfigController().getConfigPath().toFile();
LogUtil.getLogger(this.getClass()).info("已调用打开配置文件功能,{}", file);
// 创建打开文件的任务并启动线程执行任务
openFile(file);
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 64f0753..fb1c761 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
@@ -3,9 +3,9 @@ package org.jcnc.jnotepad.controller.event.handler.menuBar;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.stage.FileChooser;
-import org.jcnc.jnotepad.controller.config.AppConfigController;
import org.jcnc.jnotepad.controller.i18n.LocalizationController;
import org.jcnc.jnotepad.tool.LogUtil;
+import org.jcnc.jnotepad.tool.SingletonUtil;
import org.jcnc.jnotepad.tool.UiUtil;
import org.jcnc.jnotepad.ui.root.center.tab.JNotepadTab;
import org.slf4j.Logger;
@@ -46,7 +46,7 @@ public class SaveFile implements EventHandler {
// 如果该文件是配置文件则刷新快捷键
if (CONFIG_NAME.equals(selectedTab.getText())) {
// 重新加载语言包和快捷键
- AppConfigController.getInstance().loadConfig();
+ SingletonUtil.getAppConfigController().loadConfig();
UiUtil.getMenuBar().initShortcutKeys();
LocalizationController.initLocal();
logger.info("已刷新语言包!");
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 4d36719..f46891b 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.ui.setStage.SetStage;
+import org.jcnc.jnotepad.tool.UiUtil;
/**
@@ -21,7 +21,7 @@ public class SetBtn implements EventHandler {
*/
@Override
public void handle(ActionEvent event) {
- SetStage.getInstance().openSetStage();
+ UiUtil.getSetStage().openSetStage();
}
diff --git a/src/main/java/org/jcnc/jnotepad/controller/i18n/LocalizationController.java b/src/main/java/org/jcnc/jnotepad/controller/i18n/LocalizationController.java
index 84edbfa..0de3f0c 100644
--- a/src/main/java/org/jcnc/jnotepad/controller/i18n/LocalizationController.java
+++ b/src/main/java/org/jcnc/jnotepad/controller/i18n/LocalizationController.java
@@ -1,8 +1,8 @@
package org.jcnc.jnotepad.controller.i18n;
import org.jcnc.jnotepad.LunchApp;
-import org.jcnc.jnotepad.app.i18n.UIResourceBundle;
import org.jcnc.jnotepad.controller.config.AppConfigController;
+import org.jcnc.jnotepad.tool.SingletonUtil;
import java.util.HashMap;
import java.util.LinkedHashMap;
@@ -36,15 +36,14 @@ public class LocalizationController {
SUPPORT_LANGUAGES.put(Locale.ENGLISH, ENGLISH);
}
- public static Locale getCurrentLocal() {
- return Locale.getDefault();
+ private final AppConfigController appConfigController;
+
+ private LocalizationController() {
+ this.appConfigController = SingletonUtil.getAppConfigController();
}
- /**
- * 初始化语言配置
- */
- public static void initLocal() {
- setCurrentLocal(null);
+ public static Locale getCurrentLocal() {
+ return Locale.getDefault();
}
/**
@@ -65,19 +64,15 @@ public class LocalizationController {
}
Locale.setDefault(locale);
- UIResourceBundle.getInstance().resetLocal(getCurrentLocal());
+ SingletonUtil.getUiResourceBundle().resetLocal(getCurrentLocal());
LOCALIZATION_CONFIG.setLanguage(SUPPORT_LANGUAGES.get(locale));
}
- private LocalizationController() {
- this.appConfigController = AppConfigController.getInstance();
- }
-
- private final AppConfigController appConfigController;
-
-
- private void setLanguage(String language) {
- appConfigController.updateLanguage(language);
+ /**
+ * 初始化语言配置
+ */
+ public static void initLocal() {
+ setCurrentLocal(null);
}
/**
@@ -88,4 +83,8 @@ public class LocalizationController {
public String getLanguage() {
return appConfigController.getLanguage();
}
+
+ private void setLanguage(String language) {
+ appConfigController.updateLanguage(language);
+ }
}
diff --git a/src/main/java/org/jcnc/jnotepad/manager/ThreadPoolManager.java b/src/main/java/org/jcnc/jnotepad/manager/ThreadPoolManager.java
index cf7f6ff..7201662 100644
--- a/src/main/java/org/jcnc/jnotepad/manager/ThreadPoolManager.java
+++ b/src/main/java/org/jcnc/jnotepad/manager/ThreadPoolManager.java
@@ -13,9 +13,6 @@ import java.util.concurrent.atomic.AtomicInteger;
* @author gewuyou
*/
public class ThreadPoolManager {
- private ThreadPoolManager() {
- }
-
private static final Logger logger = LogUtil.getLogger(ThreadPoolManager.class);
/**
* 核心线程数
@@ -45,18 +42,6 @@ public class ThreadPoolManager {
* 当前运行线程数
*/
private static final AtomicInteger THREAD_COUNT = new AtomicInteger(1);
-
- /**
- * 当前运行线程数自减
- *
- * @apiNote 当你创建任务时,务必在最后执行一次该方法
- * @see ThreadPoolManager
- * @since 2023/8/26 22:00
- */
- public static void threadContSelfSubtracting() {
- THREAD_COUNT.decrementAndGet();
- }
-
/**
* 线程工厂
*/
@@ -78,6 +63,20 @@ public class ThreadPoolManager {
private static final ThreadPoolExecutor THREAD_POOL = new ThreadPoolExecutor(
CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_TIME, TIME_UNIT, BLOCKING_QUEUE, THREAD_FACTORY, HANDLER);
+ private ThreadPoolManager() {
+ }
+
+ /**
+ * 当前运行线程数自减
+ *
+ * @apiNote 当你创建任务时,务必在最后执行一次该方法
+ * @see ThreadPoolManager
+ * @since 2023/8/26 22:00
+ */
+ public static void threadContSelfSubtracting() {
+ THREAD_COUNT.decrementAndGet();
+ }
+
public static ExecutorService getThreadPool() {
return THREAD_POOL;
}
diff --git a/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java b/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java
index a4d07e1..0889776 100644
--- a/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java
+++ b/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java
@@ -17,11 +17,11 @@ import java.nio.charset.Charset;
* @author 许轲
*/
public class EncodingDetector {
- private static final Logger LOG = LogUtil.getLogger(EncodingDetector.class);
/**
* 编码侦测概率,阈值:50%
*/
public static final int THRESHOLD_CONFIDENCE = 50;
+ private static final Logger LOG = LogUtil.getLogger(EncodingDetector.class);
private EncodingDetector() {
diff --git a/src/main/java/org/jcnc/jnotepad/tool/JsonUtil.java b/src/main/java/org/jcnc/jnotepad/tool/JsonUtil.java
index b865755..46674ee 100644
--- a/src/main/java/org/jcnc/jnotepad/tool/JsonUtil.java
+++ b/src/main/java/org/jcnc/jnotepad/tool/JsonUtil.java
@@ -15,9 +15,6 @@ import static com.fasterxml.jackson.core.util.DefaultIndenter.SYS_LF;
* @author songdragon
*/
public class JsonUtil {
- private JsonUtil() {
- }
-
public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
static {
@@ -29,6 +26,9 @@ public class JsonUtil {
OBJECT_MAPPER.setDefaultPrettyPrinter(prettyPrinter);
}
+ private JsonUtil() {
+ }
+
public static String toJsonString(Object o) {
try {
return OBJECT_MAPPER.writeValueAsString(o);
diff --git a/src/main/java/org/jcnc/jnotepad/tool/SingletonUtil.java b/src/main/java/org/jcnc/jnotepad/tool/SingletonUtil.java
new file mode 100644
index 0000000..22e1a7d
--- /dev/null
+++ b/src/main/java/org/jcnc/jnotepad/tool/SingletonUtil.java
@@ -0,0 +1,63 @@
+package org.jcnc.jnotepad.tool;
+
+
+import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
+import org.jcnc.jnotepad.controller.config.AppConfigController;
+import org.jcnc.jnotepad.controller.manager.Controller;
+
+/**
+ * 单例工具
+ * 封装了除UI组件外项目中所有需要的单例组件,以减少单例带来的代码的复杂性
+ *
+ * @author gewuyou
+ */
+public class SingletonUtil {
+
+
+ /**
+ * 控制器类
+ */
+ private static final Controller CONTROLLER = Controller.getInstance();
+
+ /**
+ * 应用程序配置控制器
+ */
+ private static final AppConfigController APP_CONFIG_CONTROLLER = AppConfigController.getInstance();
+ /**
+ * UI资源绑定组件
+ */
+ private static final UiResourceBundle UI_RESOURCE_BUNDLE = UiResourceBundle.getInstance();
+
+ private SingletonUtil() {
+ }
+
+ /**
+ * 获取控制器类
+ *
+ * @return org.jcnc.jnotepad.controller.manager.Controller
+ * @since 2023/8/30 13:25
+ */
+ public static Controller getController() {
+ return CONTROLLER;
+ }
+
+ /**
+ * 获取应用程序配置控制器
+ *
+ * @return org.jcnc.jnotepad.controller.config.AppConfigController
+ * @since 2023/8/30 12:48
+ */
+ public static AppConfigController getAppConfigController() {
+ return APP_CONFIG_CONTROLLER;
+ }
+
+ /**
+ * 获取UI资源绑定组件I
+ *
+ * @return org.jcnc.jnotepad.app.i18n.UiResourceBundle
+ * @since 2023/8/30 12:45
+ */
+ public static UiResourceBundle getUiResourceBundle() {
+ return UI_RESOURCE_BUNDLE;
+ }
+}
diff --git a/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java b/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java
index caee381..5bffe22 100644
--- a/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java
+++ b/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java
@@ -7,6 +7,7 @@ import org.jcnc.jnotepad.ui.root.bottom.status.JNotepadStatusBox;
import org.jcnc.jnotepad.ui.root.center.tab.JNotepadTab;
import org.jcnc.jnotepad.ui.root.center.tab.JNotepadTabPane;
import org.jcnc.jnotepad.ui.root.top.menu.JNotepadMenuBar;
+import org.jcnc.jnotepad.ui.setStage.SetStage;
import org.jcnc.jnotepad.view.manager.ViewManager;
import java.util.Objects;
@@ -18,9 +19,6 @@ import java.util.Objects;
* @author gewuyou
*/
public class UiUtil {
- private UiUtil() {
- }
-
/**
* 标签页布局组件
*/
@@ -41,6 +39,23 @@ public class UiUtil {
* 应用程序图标
*/
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;
+ }
/**
* 获取应用程序图标
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 b64c6b8..428214d 100644
--- a/src/main/java/org/jcnc/jnotepad/ui/module/LineNumberTextArea.java
+++ b/src/main/java/org/jcnc/jnotepad/ui/module/LineNumberTextArea.java
@@ -3,11 +3,10 @@ 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.controller.config.AppConfigController;
import org.jcnc.jnotepad.tool.LogUtil;
-import org.jcnc.jnotepad.ui.root.bottom.status.JNotepadStatusBox;
+import org.jcnc.jnotepad.tool.SingletonUtil;
+import org.jcnc.jnotepad.tool.UiUtil;
import org.jcnc.jnotepad.ui.root.center.tab.JNotepadTab;
-import org.jcnc.jnotepad.ui.root.center.tab.JNotepadTabPane;
import java.io.BufferedWriter;
import java.io.File;
@@ -18,16 +17,15 @@ import java.io.IOException;
* @author 许轲
*/
public class LineNumberTextArea extends BorderPane {
- private final TextArea mainTextArea;
- private final TextArea lineNumberArea;
-
static final int[] SIZE_TABLE = {9, 99, 999, 9999, 99999, 999999, 9999999,
99999999, 999999999, Integer.MAX_VALUE};
private static final int MIN_LINE_NUMBER_WIDTH = 30;
+ private final TextArea mainTextArea;
+ private final TextArea lineNumberArea;
public LineNumberTextArea() {
mainTextArea = new TextArea();
- mainTextArea.setWrapText(AppConfigController.getInstance().getAutoLineConfig());
+ mainTextArea.setWrapText(SingletonUtil.getAppConfigController().getAutoLineConfig());
lineNumberArea = new TextArea();
lineNumberArea.setEditable(false);
@@ -58,12 +56,12 @@ public class LineNumberTextArea extends BorderPane {
lineNumberArea.textProperty().addListener((observable, oldValue, newValue) -> updateLineNumberWidth());
- this.mainTextArea.caretPositionProperty().addListener((caretObservable, oldPosition, newPosition) -> JNotepadStatusBox.getInstance().updateWordCountStatusLabel());
+ this.mainTextArea.caretPositionProperty().addListener((caretObservable, oldPosition, newPosition) -> UiUtil.getStatusBox().updateWordCountStatusLabel());
this.textProperty().addListener((observable, oldValue, newValue) -> {
// 更新行号
updateLineNumberArea();
// 更新状态栏
- JNotepadStatusBox.getInstance().updateWordCountStatusLabel();
+ UiUtil.getStatusBox().updateWordCountStatusLabel();
// 自动保存
save();
});
@@ -73,7 +71,7 @@ public class LineNumberTextArea extends BorderPane {
* 以原文件编码格式写回文件
*/
public void save() {
- JNotepadTab tab = JNotepadTabPane.getInstance().getSelected();
+ JNotepadTab tab = UiUtil.getJnotepadtab();
if (tab != null) {
File file = (File) tab.getUserData();
String newValue = this.mainTextArea.getText();
@@ -87,6 +85,7 @@ public class LineNumberTextArea extends BorderPane {
}
}
}
+
private void updateLineNumberWidth() {
int numOfLines = mainTextArea.getParagraphs().size();
int count = 1;
diff --git a/src/main/java/org/jcnc/jnotepad/ui/root/bottom/status/JNotepadStatusBox.java b/src/main/java/org/jcnc/jnotepad/ui/root/bottom/status/JNotepadStatusBox.java
index ef0c0cd..6aa2502 100644
--- a/src/main/java/org/jcnc/jnotepad/ui/root/bottom/status/JNotepadStatusBox.java
+++ b/src/main/java/org/jcnc/jnotepad/ui/root/bottom/status/JNotepadStatusBox.java
@@ -3,7 +3,7 @@ package org.jcnc.jnotepad.ui.root.bottom.status;
import javafx.geometry.Insets;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
-import org.jcnc.jnotepad.app.i18n.UIResourceBundle;
+import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.constants.TextConstants;
import org.jcnc.jnotepad.ui.module.AbstractHBox;
import org.jcnc.jnotepad.ui.root.center.tab.JNotepadTab;
@@ -21,13 +21,11 @@ import java.nio.charset.Charset;
public class JNotepadStatusBox extends AbstractHBox {
private static final JNotepadStatusBox STATUS_BOX = new JNotepadStatusBox();
+ private static final String STATUS_LABEL_FORMAT = "%s : %d \t%s: %d \t%s: %d \t";
/**
* 字数统计及光标
*/
private Label statusLabel;
- private static final String STATUS_LABEL_FORMAT = "%s : %d \t%s: %d \t%s: %d \t";
-
-
/**
* 显示文本编码
*/
@@ -38,6 +36,10 @@ public class JNotepadStatusBox extends AbstractHBox {
initStatusBox();
}
+ public static JNotepadStatusBox getInstance() {
+ return STATUS_BOX;
+ }
+
/**
* 初始化状态栏组件
*
@@ -56,14 +58,10 @@ public class JNotepadStatusBox extends AbstractHBox {
this.getChildren().add(encodingLabel);
this.getProperties().put("borderpane-margin", new Insets(5, 10, 5, 10));
- UIResourceBundle.getInstance().addListener((observable, oldValue, newValue) -> updateWhenTabSelected());
+ UiResourceBundle.getInstance().addListener((observable, oldValue, newValue) -> updateWhenTabSelected());
}
- public static JNotepadStatusBox getInstance() {
- return STATUS_BOX;
- }
-
public void updateEncodingLabel() {
updateEncodingLabel(null);
}
@@ -143,9 +141,9 @@ public class JNotepadStatusBox extends AbstractHBox {
}
protected String getStatusBarFormattedText(int row, int column, int wordCount) {
- String rowText = UIResourceBundle.getContent(TextConstants.ROW);
- String columnText = UIResourceBundle.getContent(TextConstants.COLUMN);
- String wordCountText = UIResourceBundle.getContent(TextConstants.WORD_COUNT);
+ String rowText = UiResourceBundle.getContent(TextConstants.ROW);
+ String columnText = UiResourceBundle.getContent(TextConstants.COLUMN);
+ String wordCountText = UiResourceBundle.getContent(TextConstants.WORD_COUNT);
return String.format(STATUS_LABEL_FORMAT,
rowText,
row,
@@ -158,6 +156,6 @@ public class JNotepadStatusBox extends AbstractHBox {
protected String getEncodingFormattedText(String encoding) {
String encodingLabelFormat = "\t%s : %s";
- return String.format(encodingLabelFormat, UIResourceBundle.getContent(TextConstants.ENCODE), encoding);
+ return String.format(encodingLabelFormat, UiResourceBundle.getContent(TextConstants.ENCODE), encoding);
}
}
diff --git a/src/main/java/org/jcnc/jnotepad/ui/root/center/tab/JNotepadTab.java b/src/main/java/org/jcnc/jnotepad/ui/root/center/tab/JNotepadTab.java
index 711e315..d5edb7a 100644
--- a/src/main/java/org/jcnc/jnotepad/ui/root/center/tab/JNotepadTab.java
+++ b/src/main/java/org/jcnc/jnotepad/ui/root/center/tab/JNotepadTab.java
@@ -14,6 +14,7 @@ import java.nio.charset.Charset;
*/
public class JNotepadTab extends Tab {
+ private final LineNumberTextArea lineNumberTextArea;
/**
* 默认关闭自动换行
*/
@@ -22,18 +23,8 @@ public class JNotepadTab extends Tab {
* 是否与本地文件关联
*/
private boolean isRelevance = false;
-
- private final LineNumberTextArea lineNumberTextArea;
private Charset charset = Charset.defaultCharset();
- public boolean isRelevance() {
- return isRelevance;
- }
-
- public void setRelevance(boolean relevance) {
- isRelevance = relevance;
- }
-
public JNotepadTab(String tabTitle) {
this(tabTitle, new LineNumberTextArea());
}
@@ -50,6 +41,14 @@ public class JNotepadTab extends Tab {
this.charset = charset;
}
+ public boolean isRelevance() {
+ return isRelevance;
+ }
+
+ public void setRelevance(boolean relevance) {
+ isRelevance = relevance;
+ }
+
public boolean isAutoLine() {
return autoLine;
}
diff --git a/src/main/java/org/jcnc/jnotepad/ui/root/center/tab/JNotepadTabPane.java b/src/main/java/org/jcnc/jnotepad/ui/root/center/tab/JNotepadTabPane.java
index c922108..dcd1398 100644
--- a/src/main/java/org/jcnc/jnotepad/ui/root/center/tab/JNotepadTabPane.java
+++ b/src/main/java/org/jcnc/jnotepad/ui/root/center/tab/JNotepadTabPane.java
@@ -17,6 +17,10 @@ public class JNotepadTabPane extends TabPane {
initListeners();
}
+ public static JNotepadTabPane getInstance() {
+ return TAB_PANE;
+ }
+
/**
* 初始化监听器
*/
@@ -34,10 +38,6 @@ public class JNotepadTabPane extends TabPane {
);
}
- public static JNotepadTabPane getInstance() {
- return TAB_PANE;
- }
-
/**
* 添加新tab并设置为选中状态
*
diff --git a/src/main/java/org/jcnc/jnotepad/ui/root/top/menu/JNotepadMenuBar.java b/src/main/java/org/jcnc/jnotepad/ui/root/top/menu/JNotepadMenuBar.java
index daf051e..404639d 100644
--- a/src/main/java/org/jcnc/jnotepad/ui/root/top/menu/JNotepadMenuBar.java
+++ b/src/main/java/org/jcnc/jnotepad/ui/root/top/menu/JNotepadMenuBar.java
@@ -5,7 +5,7 @@ import javafx.scene.control.*;
import javafx.scene.input.KeyCombination;
import javafx.stage.Stage;
import org.jcnc.jnotepad.app.config.AppConfig;
-import org.jcnc.jnotepad.app.i18n.UIResourceBundle;
+import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.controller.config.AppConfigController;
import org.jcnc.jnotepad.controller.event.handler.menuBar.*;
import org.jcnc.jnotepad.controller.event.handler.tool.SetBtn;
@@ -27,20 +27,20 @@ import static org.jcnc.jnotepad.constants.TextConstants.*;
*/
public class JNotepadMenuBar extends MenuBar {
+ private static final JNotepadMenuBar MENU_BAR = new JNotepadMenuBar();
+ private final Map itemMap = new HashMap<>();
/**
* 标签页布局组件封装。
*/
JNotepadTabPane jNotepadTabPane = JNotepadTabPane.getInstance();
-
- private static final JNotepadMenuBar MENU_BAR = new JNotepadMenuBar();
-
AppConfigController appConfigController = AppConfigController.getInstance();
Logger logger = LogUtil.getLogger(this.getClass());
-
- private JNotepadMenuBar() {
- initMenuBar();
- }
-
+ /**
+ * 工具栏
+ */
+ JNotepadToolBar toolBar = JNotepadToolBar.getInstance();
+ // 获取工具栏中的setButton
+ Button setButton = toolBar.getSetButton();
/**
* 文件菜单
*/
@@ -49,18 +49,16 @@ public class JNotepadMenuBar extends MenuBar {
* 设置菜单
*/
private Menu setMenu;
+
+ /// 菜单按钮
/**
* 插件菜单
*/
private Menu pluginMenu;
-
/**
* 语言菜单
*/
private Menu languageMenu;
-
- /// 菜单按钮
-
/**
* 新建
*/
@@ -101,7 +99,6 @@ public class JNotepadMenuBar extends MenuBar {
* 置顶按钮
*/
private CheckMenuItem topItem;
-
/**
* 中文选项
*/
@@ -110,15 +107,14 @@ public class JNotepadMenuBar extends MenuBar {
* 英文选项
*/
private RadioMenuItem englishItem;
- private final Map itemMap = new HashMap<>();
- /**
- * 工具栏
- */
- JNotepadToolBar toolBar = JNotepadToolBar.getInstance();
+ private JNotepadMenuBar() {
+ initMenuBar();
+ }
- // 获取工具栏中的setButton
- Button setButton = toolBar.getSetButton();
+ public static JNotepadMenuBar getInstance() {
+ return MENU_BAR;
+ }
/**
* 设置当前语言选中状态
@@ -176,17 +172,17 @@ public class JNotepadMenuBar extends MenuBar {
logger.info("初始化语言菜单!");
// 语言菜单
languageMenu = new Menu();
- UIResourceBundle.bindStringProperty(languageMenu.textProperty(), LANGUAGE);
+ UiResourceBundle.bindStringProperty(languageMenu.textProperty(), LANGUAGE);
ToggleGroup languageToggleGroup = new ToggleGroup();
chineseItem = new RadioMenuItem();
- UIResourceBundle.bindStringProperty(chineseItem.textProperty(), UPPER_CHINESE);
+ UiResourceBundle.bindStringProperty(chineseItem.textProperty(), UPPER_CHINESE);
chineseItem.setUserData(Locale.CHINESE);
itemMap.put("chineseItem", chineseItem);
languageToggleGroup.getToggles().add(chineseItem);
englishItem = new RadioMenuItem();
- UIResourceBundle.bindStringProperty(englishItem.textProperty(), UPPER_ENGLISH);
+ UiResourceBundle.bindStringProperty(englishItem.textProperty(), UPPER_ENGLISH);
englishItem.setUserData(Locale.ENGLISH);
itemMap.put("englishItem", englishItem);
languageToggleGroup.getToggles().add(englishItem);
@@ -202,27 +198,27 @@ public class JNotepadMenuBar extends MenuBar {
logger.info("初始化文件菜单!");
// 文件菜单
fileMenu = new Menu();
- UIResourceBundle.bindStringProperty(fileMenu.textProperty(), FILE);
+ UiResourceBundle.bindStringProperty(fileMenu.textProperty(), FILE);
newItem = new MenuItem();
- UIResourceBundle.bindStringProperty(newItem.textProperty(), NEW);
+ UiResourceBundle.bindStringProperty(newItem.textProperty(), NEW);
itemMap.put("newItem", newItem);
openItem = new MenuItem();
- UIResourceBundle.bindStringProperty(openItem.textProperty(), OPEN);
+ UiResourceBundle.bindStringProperty(openItem.textProperty(), OPEN);
itemMap.put("openItem", openItem);
saveItem = new MenuItem();
- UIResourceBundle.bindStringProperty(saveItem.textProperty(), SAVE);
+ UiResourceBundle.bindStringProperty(saveItem.textProperty(), SAVE);
itemMap.put("saveItem", saveItem);
saveAsItem = new MenuItem();
- UIResourceBundle.bindStringProperty(saveAsItem.textProperty(), SAVE_AS);
+ UiResourceBundle.bindStringProperty(saveAsItem.textProperty(), SAVE_AS);
itemMap.put("saveAsItem", saveAsItem);
renameItem = new MenuItem();
- UIResourceBundle.bindStringProperty(renameItem.textProperty(), RENAME);
+ UiResourceBundle.bindStringProperty(renameItem.textProperty(), RENAME);
itemMap.put("renameItem", renameItem);
fileMenu.getItems().addAll(newItem, openItem, saveItem, saveAsItem, renameItem);
@@ -235,19 +231,19 @@ public class JNotepadMenuBar extends MenuBar {
logger.info("初始化设置菜单");
// 设置菜单
setMenu = new Menu();
- UIResourceBundle.bindStringProperty(setMenu.textProperty(), SET);
+ UiResourceBundle.bindStringProperty(setMenu.textProperty(), SET);
lineFeedItem = new CheckMenuItem();
- UIResourceBundle.bindStringProperty(lineFeedItem.textProperty(), WORD_WRAP);
+ UiResourceBundle.bindStringProperty(lineFeedItem.textProperty(), WORD_WRAP);
itemMap.put("lineFeedItem", lineFeedItem);
lineFeedItem.selectedProperty().set(true);
topItem = new CheckMenuItem();
- UIResourceBundle.bindStringProperty(topItem.textProperty(), TOP);
+ UiResourceBundle.bindStringProperty(topItem.textProperty(), TOP);
itemMap.put("topItem", topItem);
openConfigItem = new MenuItem();
- UIResourceBundle.bindStringProperty(openConfigItem.textProperty(), OPEN_CONFIGURATION_FILE);
+ UiResourceBundle.bindStringProperty(openConfigItem.textProperty(), OPEN_CONFIGURATION_FILE);
itemMap.put("openConfigItem", openConfigItem);
itemMap.put("languageMenu", languageMenu);
@@ -261,23 +257,19 @@ public class JNotepadMenuBar extends MenuBar {
logger.info("初始化插件菜单!");
// 插件菜单
pluginMenu = new Menu();
- UIResourceBundle.bindStringProperty(pluginMenu.textProperty(), PLUGIN);
+ UiResourceBundle.bindStringProperty(pluginMenu.textProperty(), PLUGIN);
addItem = new MenuItem();
- UIResourceBundle.bindStringProperty(addItem.textProperty(), ADD_PLUGIN);
+ UiResourceBundle.bindStringProperty(addItem.textProperty(), ADD_PLUGIN);
itemMap.put("addItem", addItem);
countItem = new MenuItem();
- UIResourceBundle.bindStringProperty(countItem.textProperty(), STATISTICS);
+ UiResourceBundle.bindStringProperty(countItem.textProperty(), STATISTICS);
itemMap.put("countItem", countItem);
pluginMenu.getItems().addAll(addItem, countItem);
}
- public static JNotepadMenuBar getInstance() {
- return MENU_BAR;
- }
-
/**
* 初始化事件处理
*/
diff --git a/src/main/java/org/jcnc/jnotepad/ui/root/top/tools/JNotepadToolBar.java b/src/main/java/org/jcnc/jnotepad/ui/root/top/tools/JNotepadToolBar.java
index 4b1f2e2..e84d498 100644
--- a/src/main/java/org/jcnc/jnotepad/ui/root/top/tools/JNotepadToolBar.java
+++ b/src/main/java/org/jcnc/jnotepad/ui/root/top/tools/JNotepadToolBar.java
@@ -26,11 +26,11 @@ public class JNotepadToolBar extends ToolBar {
}
- public Button getSetButton() {
- return setButton;
- }
-
public static JNotepadToolBar getInstance() {
return INSTANCE;
}
+
+ public Button getSetButton() {
+ return setButton;
+ }
}
diff --git a/src/main/java/org/jcnc/jnotepad/ui/root/top/tools/ToolHBox.java b/src/main/java/org/jcnc/jnotepad/ui/root/top/tools/ToolHBox.java
index 96df3b4..6a6c238 100644
--- a/src/main/java/org/jcnc/jnotepad/ui/root/top/tools/ToolHBox.java
+++ b/src/main/java/org/jcnc/jnotepad/ui/root/top/tools/ToolHBox.java
@@ -18,6 +18,4 @@ public class ToolHBox extends HBox {
}
-
-
}
diff --git a/src/main/java/org/jcnc/jnotepad/ui/setStage/SetStage.java b/src/main/java/org/jcnc/jnotepad/ui/setStage/SetStage.java
index 874998e..b47794f 100644
--- a/src/main/java/org/jcnc/jnotepad/ui/setStage/SetStage.java
+++ b/src/main/java/org/jcnc/jnotepad/ui/setStage/SetStage.java
@@ -4,10 +4,11 @@ import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.SplitPane;
-import javafx.scene.layout.StackPane;
import javafx.scene.control.TitledPane;
+import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
+import org.jcnc.jnotepad.tool.UiUtil;
/**
* 设置窗口管理类,实现了单例模式。
@@ -16,7 +17,9 @@ import javafx.stage.Stage;
*/
public class SetStage {
- // 唯一的 SetStage 实例,使用单例模式
+ /**
+ * 唯一的 SetStage 实例,使用单例模式
+ */
private static final SetStage SET_STAGE = new SetStage();
private StackPane contentDisplay;
@@ -24,6 +27,10 @@ public class SetStage {
private ListView appearanceListView;
private ListView securityListView;
+ private SetStage() {
+ // 私有构造方法以实现单例模式
+ }
+
/**
* 获取 SetStage 的唯一实例。
*
@@ -33,10 +40,6 @@ public class SetStage {
return SET_STAGE;
}
- private SetStage() {
- // 私有构造方法以实现单例模式
- }
-
/**
* 打开设置窗口。
*/
@@ -65,7 +68,8 @@ public class SetStage {
// 创建一个分割面板,左侧是设置列表,右侧是内容显示区域
SplitPane splitPane = new SplitPane(titledPaneContainer, contentDisplay);
- splitPane.setDividerPositions(0.3); // 设置分割位置
+ // 设置分割位置
+ splitPane.setDividerPositions(0.3);
// 创建设置窗口的场景
Scene scene = new Scene(splitPane, 800, 600);
@@ -74,6 +78,7 @@ public class SetStage {
Stage setStage = new Stage();
setStage.setScene(scene);
setStage.setTitle("设置窗口");
+ setStage.getIcons().add(UiUtil.getIcon());
setStage.show();
}
@@ -101,7 +106,4 @@ public class SetStage {
contentDisplay.getChildren().setAll(new Label(selectedItem + " 的设置内容"));
}
}
-
-
-
}
diff --git a/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java b/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java
index b536773..3d25a34 100644
--- a/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java
+++ b/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java
@@ -15,27 +15,26 @@ import org.jcnc.jnotepad.ui.root.top.RootTopVBox;
*/
public class ViewManager {
- private int tabIndex = 0;
+ private static ViewManager instance = null;
// 主界面布局
+ private int tabIndex = 0;
/**
* 主布局
*/
private BorderPane root;
- private static ViewManager instance = null;
-
/**
- * 自增并获取标签页索引
+ * 构造函数。设置场景和根布局。
*
- * @return int 标签页索引
- * @apiNote ++tabIndex
+ * @param scene 与视图相关联的JavaFX场景。
*/
- public int selfIncreaseAndGetTabIndex() {
- return ++tabIndex;
- }
+ private ViewManager(Scene scene) {
+ root = new BorderPane();
+ scene.setRoot(root);
+ }
/**
* 获取ViewManager的实例。如果实例不存在,则创建一个新实例。
@@ -59,14 +58,13 @@ public class ViewManager {
}
/**
- * 构造函数。设置场景和根布局。
+ * 自增并获取标签页索引
*
- * @param scene 与视图相关联的JavaFX场景。
+ * @return int 标签页索引
+ * @apiNote ++tabIndex
*/
- private ViewManager(Scene scene) {
- root = new BorderPane();
- scene.setRoot(root);
-
+ public int selfIncreaseAndGetTabIndex() {
+ return ++tabIndex;
}
/**
diff --git a/src/main/resources/img/icon.svg b/src/main/resources/img/icon.svg
index 7946550..bdeb0d5 100644
--- a/src/main/resources/img/icon.svg
+++ b/src/main/resources/img/icon.svg
@@ -1,8 +1,9 @@