diff --git a/pom.xml b/pom.xml index ded11a0..6feefc6 100644 --- a/pom.xml +++ b/pom.xml @@ -13,8 +13,6 @@ UTF-8 5.9.2 - - io.github.mkpaz diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 13e0e4f..fc04115 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -22,5 +22,8 @@ module org.jcnc.jnotepad { exports org.jcnc.jnotepad.constants; exports org.jcnc.jnotepad.ui; exports org.jcnc.jnotepad.controller.i18n; + exports org.jcnc.jnotepad.ui.tab; + exports org.jcnc.jnotepad.ui.status; + exports org.jcnc.jnotepad.ui.menu; opens org.jcnc.jnotepad.app.config; } \ No newline at end of file diff --git a/src/main/java/org/jcnc/jnotepad/Interface/ControllerInterface.java b/src/main/java/org/jcnc/jnotepad/Interface/ControllerInterface.java index c0f68f7..004d939 100644 --- a/src/main/java/org/jcnc/jnotepad/Interface/ControllerInterface.java +++ b/src/main/java/org/jcnc/jnotepad/Interface/ControllerInterface.java @@ -1,8 +1,5 @@ package org.jcnc.jnotepad.Interface; -import org.jcnc.jnotepad.ui.LineNumberTextArea; - -import java.io.File; import java.util.List; /** diff --git a/src/main/java/org/jcnc/jnotepad/LunchApp.java b/src/main/java/org/jcnc/jnotepad/LunchApp.java index 24b90d5..089b152 100644 --- a/src/main/java/org/jcnc/jnotepad/LunchApp.java +++ b/src/main/java/org/jcnc/jnotepad/LunchApp.java @@ -42,9 +42,7 @@ public class LunchApp extends Application { scene = new Scene(root, width, length); Application.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet()); scene.getStylesheets().add(Objects.requireNonNull(getClass().getResource("/css/styles.css")).toExternalForm()); - initUIComponents(); - - + initUiComponents(); UIResourceBundle.bindStringProperty(primaryStage.titleProperty(), TextConstants.TITLE); primaryStage.setWidth(width); primaryStage.setHeight(length); @@ -53,7 +51,7 @@ public class LunchApp extends Application { primaryStage.show(); } - private void initUIComponents() { + private void initUiComponents() { //1. 加载语言 LocalizationController.initLocal(); 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 99cfcdc..3b605f3 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java +++ b/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java @@ -15,6 +15,11 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; +/** + * 应用程序配置控制器 + * + * @author songdragon + */ public class AppConfigController { private static final Logger logger = LogUtil.getLogger(AppConfigController.class); @@ -104,7 +109,7 @@ public class AppConfigController { /** * 获取当前配置文件所在目录 * - * @return + * @return 所在目录 */ public String getDir() { return dir; diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/NewFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/NewFile.java index 9bc2952..a0bc2ea 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/NewFile.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/NewFile.java @@ -4,8 +4,8 @@ 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.tool.UiUtil; import org.jcnc.jnotepad.ui.LineNumberTextArea; -import org.jcnc.jnotepad.ui.status.JNotepadStatusBox; import org.jcnc.jnotepad.ui.tab.JNotepadTab; import org.jcnc.jnotepad.ui.tab.JNotepadTabPane; import org.jcnc.jnotepad.view.manager.ViewManager; @@ -37,13 +37,13 @@ public class NewFile implements EventHandler { // 设置当前标签页与本地文件无关联 textArea.setRelevance(false); // TODO: refactor:统一TextArea新建、绑定监听器入口 - ViewManager viewManager = ViewManager.getInstance(); + ViewManager viewManager = UiUtil.getViewManager(); // 将Tab页添加到TabPane中 JNotepadTabPane.getInstance().addNewTab(new JNotepadTab(UIResourceBundle.getContent(TextConstants.NEW_FILE) + viewManager.selfIncreaseAndGetTabIndex(), textArea)); // 更新编码信息 - JNotepadStatusBox.getInstance().updateEncodingLabel(); + UiUtil.getStatusBox().updateEncodingLabel(); } } \ No newline at end of file diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/OpenFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/OpenFile.java index ad2c8c7..ba676e6 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/OpenFile.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/OpenFile.java @@ -8,6 +8,7 @@ import javafx.stage.FileChooser; import org.jcnc.jnotepad.manager.ThreadPoolManager; import org.jcnc.jnotepad.tool.EncodingDetector; import org.jcnc.jnotepad.tool.LogUtil; +import org.jcnc.jnotepad.tool.UiUtil; import org.jcnc.jnotepad.ui.LineNumberTextArea; import org.jcnc.jnotepad.ui.tab.JNotepadTab; import org.jcnc.jnotepad.ui.tab.JNotepadTabPane; @@ -36,11 +37,10 @@ public class OpenFile implements EventHandler { */ @Override public void handle(ActionEvent event) { - // 创建文件选择器 FileChooser fileChooser = new FileChooser(); // 显示文件选择对话框,并获取选中的文件 - File file = fileChooser.showOpenDialog(null); + File file = fileChooser.showOpenDialog(UiUtil.getAppWindow()); if (file != null) { openFile(file); } diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveFile.java index 4f2db0f..50173af 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveFile.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveFile.java @@ -6,10 +6,9 @@ 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.UiUtil; import org.jcnc.jnotepad.ui.LineNumberTextArea; -import org.jcnc.jnotepad.ui.menu.JNotepadMenuBar; import org.jcnc.jnotepad.ui.tab.JNotepadTab; -import org.jcnc.jnotepad.ui.tab.JNotepadTabPane; import org.slf4j.Logger; import java.io.File; @@ -33,7 +32,7 @@ public class SaveFile implements EventHandler { @Override public void handle(ActionEvent actionEvent) { // 获取当前tab页 - JNotepadTab selectedTab = JNotepadTabPane.getInstance().getSelected(); + JNotepadTab selectedTab = UiUtil.getJnotepadtab(); if (selectedTab == null) { return; } @@ -51,7 +50,7 @@ public class SaveFile implements EventHandler { if (CONFIG_NAME.equals(selectedTab.getText())) { // 重新加载语言包和快捷键 AppConfigController.getInstance().loadConfig(); - JNotepadMenuBar.getMenuBar().initShortcutKeys(); + UiUtil.getMenuBar().initShortcutKeys(); LocalizationController.initLocal(); logger.info("已刷新语言包!"); logger.info("已刷新快捷键!"); @@ -67,7 +66,7 @@ public class SaveFile implements EventHandler { * @see LogUtil */ protected void saveTab(Class currentClass) { - JNotepadTab selectedTab = JNotepadTabPane.getInstance().getSelected(); + JNotepadTab selectedTab = UiUtil.getJnotepadtab(); if (selectedTab != null) { // 创建一个文件窗口 FileChooser fileChooser = new FileChooser(); @@ -75,7 +74,8 @@ public class SaveFile implements EventHandler { fileChooser.setInitialFileName(selectedTab.getText()); // 设置保存文件类型 fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("文本文档", "*.txt")); - File file = fileChooser.showSaveDialog(null); + // 获取应用窗口并绑定 + File file = fileChooser.showSaveDialog(UiUtil.getAppWindow()); if (file != null) { LogUtil.getLogger(currentClass).info("正在保存文件:{}", file.getName()); selectedTab.save(); 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 da1daa1..84edbfa 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/i18n/LocalizationController.java +++ b/src/main/java/org/jcnc/jnotepad/controller/i18n/LocalizationController.java @@ -13,8 +13,8 @@ import static org.jcnc.jnotepad.constants.TextConstants.CHINESE; import static org.jcnc.jnotepad.constants.TextConstants.ENGLISH; /** - * 本地化配置文件
- * 注意:该配置文件必须先于快捷键配置文件加载 + * 本地化控制器
+ * 注意:本地化配置加载应当优先于快捷键配置加载 * * @author gewuyou * @see LunchApp diff --git a/src/main/java/org/jcnc/jnotepad/tool/JsonUtil.java b/src/main/java/org/jcnc/jnotepad/tool/JsonUtil.java index 59f920e..b865755 100644 --- a/src/main/java/org/jcnc/jnotepad/tool/JsonUtil.java +++ b/src/main/java/org/jcnc/jnotepad/tool/JsonUtil.java @@ -1,7 +1,6 @@ package org.jcnc.jnotepad.tool; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.PrettyPrinter; import com.fasterxml.jackson.core.util.DefaultIndenter; import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java b/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java new file mode 100644 index 0000000..9f2c3e9 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java @@ -0,0 +1,102 @@ +package org.jcnc.jnotepad.tool; + +import javafx.stage.Window; +import org.jcnc.jnotepad.ui.menu.JNotepadMenuBar; +import org.jcnc.jnotepad.ui.status.JNotepadStatusBox; +import org.jcnc.jnotepad.ui.tab.JNotepadTab; +import org.jcnc.jnotepad.ui.tab.JNotepadTabPane; +import org.jcnc.jnotepad.view.manager.ViewManager; + +/** + * UI工具
+ * 封装了项目所有的UI组件,以减少组件单例模式造成代码的复杂性 + * + * @author gewuyou + */ +public class UiUtil { + private 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.getMenuBar(); + + /** + * 获取标签页布局组件 + * + * @return org.jcnc.jnotepad.ui.tab.JNotepadTabPane + * @apiNote JNotepadTabPane.getInstance() + * @see JNotepadTabPane + */ + + public static JNotepadTabPane getJnotepadTabPane() { + return TAB_PANE; + } + + /** + * 获取标签页组件 + * + * @return org.jcnc.jnotepad.ui.tab.JNotepadTab + * @apiNote JNotepadTabPane.getInstance().getSelected()
获取当前选中的标签页 + * @see JNotepadTabPane + */ + + public static JNotepadTab getJnotepadtab() { + return TAB_PANE.getSelected(); + } + + /** + * 获取应用窗口 + * + * @return javafx.stage.Window + * @apiNote JNotepadTabPane.getInstance().getSelected().getTabPane().getScene().getWindow() + * @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.status.JNotepadStatusBox + * @since 2023/8/29 14:14 + */ + public static JNotepadStatusBox getStatusBox() { + return STATUS_BOX; + } + + /** + * 获取菜单栏组件 + * + * @return org.jcnc.jnotepad.ui.menu.JNotepadMenuBar + * @since 2023/8/29 14:15 + */ + public static JNotepadMenuBar getMenuBar() { + return MENU_BAR; + } +} diff --git a/src/main/java/org/jcnc/jnotepad/ui/LineNumberTextArea.java b/src/main/java/org/jcnc/jnotepad/ui/LineNumberTextArea.java index acb4a03..53690b1 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/LineNumberTextArea.java +++ b/src/main/java/org/jcnc/jnotepad/ui/LineNumberTextArea.java @@ -3,10 +3,8 @@ package org.jcnc.jnotepad.ui; import javafx.beans.property.StringProperty; import javafx.scene.control.TextArea; import javafx.scene.layout.BorderPane; -import org.jcnc.jnotepad.app.config.AppConfig; import org.jcnc.jnotepad.controller.config.AppConfigController; import org.jcnc.jnotepad.tool.LogUtil; -import org.jcnc.jnotepad.ui.menu.JNotepadMenuBar; import org.jcnc.jnotepad.ui.status.JNotepadStatusBox; import org.jcnc.jnotepad.ui.tab.JNotepadTab; import org.jcnc.jnotepad.ui.tab.JNotepadTabPane; diff --git a/src/main/java/org/jcnc/jnotepad/ui/menu/JNotepadMenuBar.java b/src/main/java/org/jcnc/jnotepad/ui/menu/JNotepadMenuBar.java index ae07a03..162d0b4 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/menu/JNotepadMenuBar.java +++ b/src/main/java/org/jcnc/jnotepad/ui/menu/JNotepadMenuBar.java @@ -145,11 +145,8 @@ public class JNotepadMenuBar extends MenuBar { for (AppConfig.ShortcutKey shortcutKey : shortcutKeyConfigs) { // 保证json的key必须和变量名一致 MenuItem menuItem = this.itemMap.get(shortcutKey.getButtonName()); - if (Objects.isNull(menuItem)) { - continue; - } String shortKeyValue = shortcutKey.getShortcutKeyValue(); - if ("".equals(shortKeyValue)) { + if (Objects.isNull(menuItem) || "".equals(shortKeyValue)) { continue; } logger.info("功能名称:{}->快捷键:{}", menuItem.getText(), shortKeyValue); @@ -290,6 +287,7 @@ public class JNotepadMenuBar extends MenuBar { /** * 切换语言 + * * @param actionEvent 点击事件 */ private void toggleLanguage(ActionEvent actionEvent) { diff --git a/src/main/java/org/jcnc/jnotepad/ui/tab/JNotepadTabPane.java b/src/main/java/org/jcnc/jnotepad/ui/tab/JNotepadTabPane.java index ea509a8..c149d70 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/tab/JNotepadTabPane.java +++ b/src/main/java/org/jcnc/jnotepad/ui/tab/JNotepadTabPane.java @@ -2,8 +2,7 @@ package org.jcnc.jnotepad.ui.tab; import javafx.scene.control.TabPane; import org.jcnc.jnotepad.controller.config.AppConfigController; -import org.jcnc.jnotepad.ui.menu.JNotepadMenuBar; -import org.jcnc.jnotepad.ui.status.JNotepadStatusBox; +import org.jcnc.jnotepad.tool.UiUtil; /** * 标签页布局组件封装。 @@ -27,10 +26,10 @@ public class JNotepadTabPane extends TabPane { (ov, from, to) -> { if (to != null) { // 更新菜单栏中与tab相关设置 - JNotepadMenuBar.getMenuBar().updateMenuStatusBySelectedTab(); + UiUtil.getMenuBar().updateMenuStatusBySelectedTab(); } // 更新状态标签 - JNotepadStatusBox.getInstance().updateWhenTabSelected(); + UiUtil.getStatusBox().updateWhenTabSelected(); } ); } @@ -69,6 +68,6 @@ public class JNotepadTabPane extends TabPane { public void fireTabSelected() { JNotepadTab selectedTab = getSelected(); selectedTab.setAutoLine(AppConfigController.getInstance().getAutoLineConfig()); - JNotepadStatusBox.getInstance().updateWhenTabSelected(); + UiUtil.getStatusBox().updateWhenTabSelected(); } } diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 89ac5a3..b23a028 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -10,7 +10,7 @@ - +