diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index b3b2fc4a6e3a3801d94225eae7eec7918000eda2..3843aa4d839c63904218875dc4bfbb0833ff2f25 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -25,6 +25,8 @@ module org.jcnc.jnotepad { 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 975fa06e172df7385a94f795cb63608ef0971c72..393ae1085824a7d5da962dbb39f0066fa2a9e14e 100644 --- a/src/main/java/org/jcnc/jnotepad/LunchApp.java +++ b/src/main/java/org/jcnc/jnotepad/LunchApp.java @@ -6,6 +6,7 @@ import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.stage.Stage; +import javafx.stage.Window; import org.jcnc.jnotepad.app.i18n.UiResourceBundle; import org.jcnc.jnotepad.constants.AppConstants; import org.jcnc.jnotepad.constants.TextConstants; @@ -30,21 +31,27 @@ public class LunchApp extends Application { * 线程池 */ private final ExecutorService threadPool = ThreadPoolManager.getThreadPool(); - Scene scene; + private static final Pane ROOT = new Pane(); + private static final Scene SCENE; + + static { + double width = AppConstants.SCREEN_WIDTH; + double length = AppConstants.SCREEN_LENGTH; + SCENE = new Scene(ROOT, width, length); + } + public static void main(String[] args) { launch(args); } + public static Window getWindow() { + return SCENE.getWindow(); + } @Override public void start(Stage primaryStage) { - - Pane root = new Pane(); - double width = AppConstants.SCREEN_WIDTH; - double length = AppConstants.SCREEN_LENGTH; - scene = new Scene(root, width, length); Application.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet()); - scene.getStylesheets().add(Objects.requireNonNull(getClass().getResource("/css/styles.css")).toExternalForm()); + SCENE.getStylesheets().add(Objects.requireNonNull(getClass().getResource("/css/styles.css")).toExternalForm()); initUiComponents(); UiResourceBundle.bindStringProperty(primaryStage.titleProperty(), TextConstants.TITLE); @@ -53,11 +60,10 @@ public class LunchApp extends Application { // 使自定义标题栏可拖动 customTitleBar.makeDraggable(primaryStage);*/ // primaryStage.initStyle(StageStyle.UNDECORATED); // 移除默认窗口装饰 - - primaryStage.setScene(scene); - primaryStage.setWidth(width); - primaryStage.setHeight(length); - primaryStage.setScene(scene); + primaryStage.setScene(SCENE); + primaryStage.setWidth(SCENE.getWidth()); + primaryStage.setHeight(SCENE.getHeight()); + primaryStage.setScene(SCENE); primaryStage.getIcons().add(UiUtil.getIcon()); primaryStage.show(); } @@ -68,8 +74,8 @@ public class LunchApp extends Application { LocalizationController.initLocal(); //2. 加载组件 - ViewManager viewManager = ViewManager.getInstance(scene); - viewManager.initScreen(scene); + ViewManager viewManager = ViewManager.getInstance(SCENE); + viewManager.initScreen(SCENE); // 使用线程池加载关联文件并创建文本区域 List rawParameters = getParameters().getRaw(); 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 1a2aef33487a962346b47eeff338a0ad4cbb5077..d69b0be9c6ae58f654371cda7cf9918e1a03db60 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 @@ -4,15 +4,16 @@ import javafx.application.Platform; import javafx.concurrent.Task; import javafx.event.ActionEvent; import javafx.event.EventHandler; +import javafx.scene.control.Tab; import javafx.stage.FileChooser; import org.jcnc.jnotepad.app.i18n.UiResourceBundle; import org.jcnc.jnotepad.constants.TextConstants; import org.jcnc.jnotepad.manager.ThreadPoolManager; 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.EncodingDetector; import org.jcnc.jnotepad.tool.LogUtil; import org.jcnc.jnotepad.tool.UiUtil; -import org.jcnc.jnotepad.ui.dialog.factory.FileChooserFactory; import org.jcnc.jnotepad.ui.dialog.factory.impl.TextFileChooserFactory; import org.jcnc.jnotepad.ui.module.LineNumberTextArea; @@ -47,9 +48,10 @@ public class OpenFile implements EventHandler { null, new FileChooser.ExtensionFilter("All types", "*.*")) .showOpenDialog(UiUtil.getAppWindow()); - if (file != null) { - openFile(file); + if (file == null) { + return; } + openFile(file); } /** @@ -81,6 +83,21 @@ public class OpenFile implements EventHandler { * @param file 文件对象 */ public void openFile(File file) { + // 获取标签页集合 + JNotepadTabPane jnotepadTabPane = UiUtil.getJnotepadTabPane(); + // 遍历标签页,查找匹配的标签页 + for (Tab tab : jnotepadTabPane.getTabs()) { + // 获取绑定的文件 + File tabFile = (File) tab.getUserData(); + if (tabFile == null) { + continue; + } + if (file.getPath().equals((tabFile).getPath())) { + // 找到匹配的标签页,设置为选中状态并跳转 + jnotepadTabPane.getSelectionModel().select(tab); + return; + } + } ThreadPoolManager.getThreadPool().submit(createOpenFileTask(file)); } 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 442b5e81346e3d8f127bb96626912b398dfa97aa..c152b44bfce1a916bbb31e845a30e5ba1fca3b43 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 @@ -10,7 +10,6 @@ import org.jcnc.jnotepad.constants.TextConstants; import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTab; import org.jcnc.jnotepad.tool.LogUtil; import org.jcnc.jnotepad.tool.UiUtil; -import org.jcnc.jnotepad.ui.dialog.factory.FileChooserFactory; import org.jcnc.jnotepad.ui.dialog.factory.impl.TextFileChooserFactory; import org.slf4j.Logger; 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 b4143869856db2171caf71aea635158f4571cace..5eff265a9b30d154b21712a2c8784d5b77d33f78 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 @@ -10,7 +10,6 @@ import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTab; import org.jcnc.jnotepad.tool.LogUtil; import org.jcnc.jnotepad.tool.SingletonUtil; import org.jcnc.jnotepad.tool.UiUtil; -import org.jcnc.jnotepad.ui.dialog.factory.FileChooserFactory; import org.jcnc.jnotepad.ui.dialog.factory.impl.TextFileChooserFactory; import org.slf4j.Logger; diff --git a/src/main/java/org/jcnc/jnotepad/root/RootBorderPane.java b/src/main/java/org/jcnc/jnotepad/root/RootBorderPane.java index ea06915e22e5d9829090d1a4644ee1889593256a..62ea0ee3a59b6eec648fd3904cf7b082c6ddfb98 100644 --- a/src/main/java/org/jcnc/jnotepad/root/RootBorderPane.java +++ b/src/main/java/org/jcnc/jnotepad/root/RootBorderPane.java @@ -7,9 +7,10 @@ import org.jcnc.jnotepad.root.right.RootRightSideBarVBox; import org.jcnc.jnotepad.root.top.RootTopBorderPane; import org.jcnc.jnotepad.ui.module.AbstractBorderPane; -/* +/** * 根舞台下的Root主布局 - * */ + * @author 许轲 + */ public class RootBorderPane extends AbstractBorderPane { private static final RootBorderPane INSTANCE = new RootBorderPane(); @@ -19,11 +20,16 @@ public class RootBorderPane extends AbstractBorderPane { } private void initRootBorderPane() { - setCenterComponent(MainBorderPane.getInstance()); //中间,用于显示Main主布局 - setLeftComponent(ToolHBox.getInstance()); //主布局的左边 - setRightComponent(RootRightSideBarVBox.getInstance()); //主布局的右边 - setTopComponent(RootTopBorderPane.getInstance()); //主布局的上面 - setBottomComponent(RootBottomSideBarVBox.getInstance());//主布局的下面 + //中间,用于显示Main主布局 + setCenterComponent(MainBorderPane.getInstance()); + //主布局的左边 + setLeftComponent(ToolHBox.getInstance()); + //主布局的右边 + setRightComponent(RootRightSideBarVBox.getInstance()); + //主布局的上面 + setTopComponent(RootTopBorderPane.getInstance()); + //主布局的下面 + setBottomComponent(RootBottomSideBarVBox.getInstance()); } public static RootBorderPane 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 89fad59653b6901945856e1d8bc933e823611608..8d679a7c2f6d563f545ecbae3df44cfe94731539 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 @@ -3,9 +3,11 @@ package org.jcnc.jnotepad.root.center.main; import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTabPane; import org.jcnc.jnotepad.ui.module.AbstractBorderPane; -/* - * MainBorderPane区域,用于显示文本框以及文本框周边 - * */ +/** + * MainBorderPane区域,用于显示文本框以及文本框周边 + * + * @author 许轲 + */ public class MainBorderPane extends AbstractBorderPane { private static final MainBorderPane INSTANCE = new MainBorderPane(); @@ -15,8 +17,8 @@ public class MainBorderPane extends AbstractBorderPane { } private void initRootBorderPane() { - - setCenterComponent(JNotepadTabPane.getInstance()); //文本框 + //文本框 + setCenterComponent(JNotepadTabPane.getInstance()); } 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 40c096ba887cf613e2e44f2899324c5f60e2e005..df2e03ec048ebef3568fc73547ad7e80c77ac040 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,7 +1,7 @@ package org.jcnc.jnotepad.root.center.main.center.tab; import javafx.scene.control.TabPane; -import org.jcnc.jnotepad.controller.config.AppConfigController; +import org.jcnc.jnotepad.tool.SingletonUtil; import org.jcnc.jnotepad.tool.UiUtil; /** @@ -47,8 +47,11 @@ public class JNotepadTabPane extends TabPane { if (tab == null) { return; } + // 将标签页加入标签页列表 this.getTabs().add(tab); + // 设置索引 this.getSelectionModel().select(tab); + // 将标签页设置为选中状态 fireTabSelected(); } @@ -67,7 +70,7 @@ public class JNotepadTabPane extends TabPane { */ public void fireTabSelected() { JNotepadTab selectedTab = getSelected(); - selectedTab.setAutoLine(AppConfigController.getInstance().getAutoLineConfig()); + selectedTab.setAutoLine(SingletonUtil.getAppConfigController().getAutoLineConfig()); UiUtil.getStatusBox().updateWhenTabSelected(); } } 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 09f0fae5900d4faa6f2a2d4afb4f82c9ca1ee04a..9ef19dd5731ed836dbd61c93545082b970904332 100644 --- a/src/main/java/org/jcnc/jnotepad/root/top/RootTopBorderPane.java +++ b/src/main/java/org/jcnc/jnotepad/root/top/RootTopBorderPane.java @@ -3,9 +3,12 @@ package org.jcnc.jnotepad.root.top; import org.jcnc.jnotepad.root.top.menu.JNotepadMenuBar; import org.jcnc.jnotepad.ui.module.AbstractBorderPane; -/* - * MainBorderPane区域,用于显示文本框以及文本框周边 - * */ + +/** + * MainBorderPane区域,用于显示文本框以及文本框周边 + * + * @author 许轲 + */ public class RootTopBorderPane extends AbstractBorderPane { private static final RootTopBorderPane INSTANCE = new RootTopBorderPane(); @@ -15,7 +18,8 @@ public class RootTopBorderPane extends AbstractBorderPane { } private void initRootBorderPane() { - setTopComponent(JNotepadMenuBar.getInstance()); //文本框上面 + //文本框上面 + setTopComponent(JNotepadMenuBar.getInstance()); } public static RootTopBorderPane getInstance() { diff --git a/src/main/java/org/jcnc/jnotepad/root/top/menu/JNotepadMenuBar.java b/src/main/java/org/jcnc/jnotepad/root/top/menu/JNotepadMenuBar.java index 5b8a5e9fad326398beb581d97e18154381699f17..33b46ff668991f3751ea7660593d389c7ec8bd90 100644 --- a/src/main/java/org/jcnc/jnotepad/root/top/menu/JNotepadMenuBar.java +++ b/src/main/java/org/jcnc/jnotepad/root/top/menu/JNotepadMenuBar.java @@ -28,6 +28,9 @@ 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<>(); /** * 标签页布局组件封装。 @@ -39,7 +42,9 @@ public class JNotepadMenuBar extends MenuBar { * 工具栏 */ JNotepadToolBar toolBar = JNotepadToolBar.getInstance(); - // 获取工具栏中的setButton + /** + * 获取工具栏中的setButton + */ Button setButton = toolBar.getSetButton(); /** * 文件菜单