diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 52561f6..1ca9f3f 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -5,4 +5,10 @@ module org.jcnc.jnotepad { exports org.jcnc.jnotepad.controller; exports org.jcnc.jnotepad.tool; exports org.jcnc.jnotepad.Interface; + exports org.jcnc.jnotepad.view; + exports org.jcnc.jnotepad.controller.event.handler; + exports org.jcnc.jnotepad.controller.manager; + exports org.jcnc.jnotepad.view.init; + exports org.jcnc.jnotepad.view.manager; + exports org.jcnc.jnotepad.constants; } \ 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 bb0da77..19ec32b 100644 --- a/src/main/java/org/jcnc/jnotepad/Interface/ControllerInterface.java +++ b/src/main/java/org/jcnc/jnotepad/Interface/ControllerInterface.java @@ -17,13 +17,12 @@ public interface ControllerInterface { EventHandler getOpenFileEventHandler(); - void autoSave(TextArea textArea); - EventHandler getSaveFileEventHandler(); EventHandler getSaveAsFileEventHandler(); - void saveAsFile(); + + void autoSave(TextArea textArea); void updateStatusLabel(TextArea textArea); @@ -36,4 +35,9 @@ public interface ControllerInterface { int getRow(int caretPosition, String text); int getColumn(int caretPosition, String text); + + void initTabPane(); + + void saveAsFile(); + } diff --git a/src/main/java/org/jcnc/jnotepad/LunchApp.java b/src/main/java/org/jcnc/jnotepad/LunchApp.java index 6fd636c..8c15be0 100644 --- a/src/main/java/org/jcnc/jnotepad/LunchApp.java +++ b/src/main/java/org/jcnc/jnotepad/LunchApp.java @@ -8,16 +8,17 @@ import javafx.scene.control.TextArea; import javafx.scene.image.Image; import javafx.scene.layout.Pane; import javafx.stage.Stage; -import org.jcnc.jnotepad.controller.Controller; -import org.jcnc.jnotepad.view.View; +import org.jcnc.jnotepad.constants.Constants; +import org.jcnc.jnotepad.controller.manager.Controller; +import org.jcnc.jnotepad.view.manager.ViewManager; import java.util.List; import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import static org.jcnc.jnotepad.view.View.initItem; -import static org.jcnc.jnotepad.view.View.initTabPane; +import static org.jcnc.jnotepad.view.init.View.initItem; +import static org.jcnc.jnotepad.view.init.View.initTabPane; public class LunchApp extends Application { private static final ExecutorService threadPool = Executors.newCachedThreadPool(); @@ -77,4 +78,5 @@ public class LunchApp extends Application { public static void main(String[] args) { launch(args); } + } diff --git a/src/main/java/org/jcnc/jnotepad/Constants.java b/src/main/java/org/jcnc/jnotepad/constants/Constants.java similarity index 90% rename from src/main/java/org/jcnc/jnotepad/Constants.java rename to src/main/java/org/jcnc/jnotepad/constants/Constants.java index facf66b..ade503c 100644 --- a/src/main/java/org/jcnc/jnotepad/Constants.java +++ b/src/main/java/org/jcnc/jnotepad/constants/Constants.java @@ -1,4 +1,4 @@ -package org.jcnc.jnotepad; +package org.jcnc.jnotepad.constants; /** * Constants持有所有共享信息的全局变量 diff --git a/src/main/java/org/jcnc/jnotepad/controller/LineFeedEventHandler.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/LineFeed.java similarity index 66% rename from src/main/java/org/jcnc/jnotepad/controller/LineFeedEventHandler.java rename to src/main/java/org/jcnc/jnotepad/controller/event/handler/LineFeed.java index c14bd97..8da3d44 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/LineFeedEventHandler.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/LineFeed.java @@ -1,13 +1,13 @@ -package org.jcnc.jnotepad.controller; +package org.jcnc.jnotepad.controller.event.handler; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.control.TextArea; -public class LineFeedEventHandler implements EventHandler { +public class LineFeed implements EventHandler { private final TextArea textArea; - public LineFeedEventHandler(TextArea textArea) { + public LineFeed(TextArea textArea) { this.textArea = textArea; } @Override diff --git a/src/main/java/org/jcnc/jnotepad/controller/NewFileEventHandler.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/NewFile.java similarity index 71% rename from src/main/java/org/jcnc/jnotepad/controller/NewFileEventHandler.java rename to src/main/java/org/jcnc/jnotepad/controller/event/handler/NewFile.java index 48083f7..8641aba 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/NewFileEventHandler.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/NewFile.java @@ -1,14 +1,15 @@ -package org.jcnc.jnotepad.controller; +package org.jcnc.jnotepad.controller.event.handler; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.control.Tab; import javafx.scene.control.TextArea; -import org.jcnc.jnotepad.ViewManager; +import org.jcnc.jnotepad.controller.manager.Controller; +import org.jcnc.jnotepad.view.manager.ViewManager; -import static org.jcnc.jnotepad.ViewManager.tabPane; +import static org.jcnc.jnotepad.view.manager.ViewManager.tabPane; -public class NewFileEventHandler implements EventHandler { +public class NewFile implements EventHandler { @Override public void handle(ActionEvent event) { Controller controller = new Controller(); diff --git a/src/main/java/org/jcnc/jnotepad/controller/OpenFileEventHandler.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/OpenFile.java similarity index 83% rename from src/main/java/org/jcnc/jnotepad/controller/OpenFileEventHandler.java rename to src/main/java/org/jcnc/jnotepad/controller/event/handler/OpenFile.java index 68e3aab..05ea34c 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/OpenFileEventHandler.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/OpenFile.java @@ -1,17 +1,18 @@ -package org.jcnc.jnotepad.controller; +package org.jcnc.jnotepad.controller.event.handler; import javafx.concurrent.Task; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.control.TextArea; import javafx.stage.FileChooser; +import org.jcnc.jnotepad.controller.manager.Controller; import java.io.File; -import static org.jcnc.jnotepad.ViewManager.tabPane; +import static org.jcnc.jnotepad.view.manager.ViewManager.tabPane; // 打开文件事件处理器 -public class OpenFileEventHandler implements EventHandler { +public class OpenFile implements EventHandler { @Override public void handle(ActionEvent event) { Controller controller = new Controller(); diff --git a/src/main/java/org/jcnc/jnotepad/controller/SaveAsFileEventHandler.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveAsFile.java similarity index 86% rename from src/main/java/org/jcnc/jnotepad/controller/SaveAsFileEventHandler.java rename to src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveAsFile.java index 3ec0772..32c5d13 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/SaveAsFileEventHandler.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveAsFile.java @@ -1,19 +1,20 @@ -package org.jcnc.jnotepad.controller; +package org.jcnc.jnotepad.controller.event.handler; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.control.Tab; import javafx.scene.control.TextArea; import javafx.stage.FileChooser; +import org.jcnc.jnotepad.controller.manager.Controller; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; -import static org.jcnc.jnotepad.ViewManager.tabPane; +import static org.jcnc.jnotepad.view.manager.ViewManager.tabPane; -public class SaveAsFileEventHandler implements EventHandler { +public class SaveAsFile implements EventHandler { @Override public void handle(ActionEvent event) { Controller controller = new Controller(); diff --git a/src/main/java/org/jcnc/jnotepad/controller/SaveFileEventHandler.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveFile.java similarity index 82% rename from src/main/java/org/jcnc/jnotepad/controller/SaveFileEventHandler.java rename to src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveFile.java index af8b25e..abf04e5 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/SaveFileEventHandler.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveFile.java @@ -1,17 +1,18 @@ -package org.jcnc.jnotepad.controller; +package org.jcnc.jnotepad.controller.event.handler; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.control.Tab; import javafx.scene.control.TextArea; +import org.jcnc.jnotepad.controller.manager.Controller; import java.io.*; import java.nio.charset.StandardCharsets; -import static org.jcnc.jnotepad.ViewManager.tabPane; +import static org.jcnc.jnotepad.view.manager.ViewManager.tabPane; // 保存文件事件处理器 -public class SaveFileEventHandler implements EventHandler { +public class SaveFile implements EventHandler { @Override public void handle(ActionEvent event) { Controller controller = new Controller(); diff --git a/src/main/java/org/jcnc/jnotepad/controller/Controller.java b/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java similarity index 83% rename from src/main/java/org/jcnc/jnotepad/controller/Controller.java rename to src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java index c20bb00..6fd4231 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/Controller.java +++ b/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java @@ -1,4 +1,4 @@ -package org.jcnc.jnotepad.controller; +package org.jcnc.jnotepad.controller.manager; import javafx.application.Platform; import javafx.concurrent.Task; @@ -9,11 +9,12 @@ import javafx.scene.control.TextArea; import javafx.stage.FileChooser; import org.jcnc.jnotepad.Interface.ControllerInterface; import org.jcnc.jnotepad.LunchApp; +import org.jcnc.jnotepad.controller.event.handler.*; import java.io.*; import java.util.List; -import static org.jcnc.jnotepad.ViewManager.*; +import static org.jcnc.jnotepad.view.manager.ViewManager.*; import static org.jcnc.jnotepad.tool.EncodingDetector.detectEncoding; public class Controller implements ControllerInterface { @@ -33,17 +34,17 @@ public class Controller implements ControllerInterface { @Override public EventHandler getLineFeedEventHandler(TextArea textArea) { - return new LineFeedEventHandler(textArea); + return new LineFeed(textArea); } @Override public EventHandler getNewFileEventHandler(TextArea textArea) { - return new NewFileEventHandler(); + return new NewFile(); } @Override public EventHandler getOpenFileEventHandler() { - return new OpenFileEventHandler(); + return new OpenFile(); } @Override @@ -65,12 +66,12 @@ public class Controller implements ControllerInterface { @Override public EventHandler getSaveFileEventHandler() { - return new SaveFileEventHandler(); + return new SaveFile(); } @Override public EventHandler getSaveAsFileEventHandler() { - return new SaveAsFileEventHandler(); + return new SaveAsFile(); } @Override @@ -155,6 +156,28 @@ public class Controller implements ControllerInterface { return caretPosition - text.lastIndexOf("\n", caretPosition - 1); } + @Override + public void initTabPane() { + Controller controller = new Controller(); + + tabPane.getSelectionModel().selectedItemProperty().addListener((observable, oldTab, newTab) -> { + if (newTab != null) { + // 获取新选定的标签页并关联的文本区域 + TextArea textArea = (TextArea) newTab.getContent(); + + // 更新状态标签 + controller.updateStatusLabel(textArea); + + // 监听文本光标位置的变化,更新状态标签 + textArea.caretPositionProperty().addListener((caretObservable, oldPosition, newPosition) -> controller.updateStatusLabel(textArea)); + + // 更新编码标签 + controller.upDateEncodingLabel(textArea.getText()); + } + }); + } + + private void configureTextArea(TextArea textArea) { textArea.setWrapText(true); upDateEncodingLabel(textArea.getText()); @@ -195,6 +218,6 @@ public class Controller implements ControllerInterface { } private void saveFile() { - new SaveFileEventHandler(); + new SaveFile(); } } diff --git a/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java b/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java index bc6184e..29dafbd 100644 --- a/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java +++ b/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java @@ -40,7 +40,6 @@ public class EncodingDetector { byte[] bytes = text.getBytes(encoding); String decoded = new String(bytes, encoding); - // 解码后的文本相同表示编码有效 return text.equals(decoded); } diff --git a/src/main/java/org/jcnc/jnotepad/view/View.java b/src/main/java/org/jcnc/jnotepad/view/View.java deleted file mode 100644 index 269e9b9..0000000 --- a/src/main/java/org/jcnc/jnotepad/view/View.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.jcnc.jnotepad.view; - -import javafx.scene.control.TextArea; -import org.jcnc.jnotepad.controller.Controller; - -import static org.jcnc.jnotepad.ViewManager.*; - - -public class View { - - public static void initItem() { - // 初始化菜单项的事件处理器 - newItem.setOnAction(new Controller().getNewFileEventHandler(new TextArea())); - openItem.setOnAction(new Controller().getOpenFileEventHandler()); - saveItem.setOnAction(new Controller().getSaveFileEventHandler()); - saveAsItem.setOnAction(new Controller().getSaveAsFileEventHandler()); - lineFeedItem.setOnAction(new Controller().getLineFeedEventHandler(new TextArea())); - - } - - public static void initTabPane() { - Controller controller = new Controller(); - - tabPane.getSelectionModel().selectedItemProperty().addListener((observable, oldTab, newTab) -> { - if (newTab != null) { - // 获取新选定的标签页并关联的文本区域 - TextArea textArea = (TextArea) newTab.getContent(); - - // 更新状态标签 - controller.updateStatusLabel(textArea); - - // 监听文本光标位置的变化,更新状态标签 - textArea.caretPositionProperty().addListener((caretObservable, oldPosition, newPosition) -> controller.updateStatusLabel(textArea)); - - // 更新编码标签 - controller.upDateEncodingLabel(textArea.getText()); - } - }); - } - -} diff --git a/src/main/java/org/jcnc/jnotepad/view/init/View.java b/src/main/java/org/jcnc/jnotepad/view/init/View.java new file mode 100644 index 0000000..d065b44 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/view/init/View.java @@ -0,0 +1,24 @@ +package org.jcnc.jnotepad.view.init; + +import javafx.scene.control.TextArea; +import org.jcnc.jnotepad.controller.manager.Controller; + +import static org.jcnc.jnotepad.view.manager.ViewManager.*; + + +public class View { + + public static void initItem() { + // 初始化菜单项的事件处理器 + newItem.setOnAction(new Controller().getNewFileEventHandler(new TextArea())); + openItem.setOnAction(new Controller().getOpenFileEventHandler()); + saveItem.setOnAction(new Controller().getSaveFileEventHandler()); + saveAsItem.setOnAction(new Controller().getSaveAsFileEventHandler()); + lineFeedItem.setOnAction(new Controller().getLineFeedEventHandler(new TextArea())); + + } + + public static void initTabPane() { + new Controller().initTabPane(); + } +} diff --git a/src/main/java/org/jcnc/jnotepad/ViewManager.java b/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java similarity index 98% rename from src/main/java/org/jcnc/jnotepad/ViewManager.java rename to src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java index 3995049..845fb82 100644 --- a/src/main/java/org/jcnc/jnotepad/ViewManager.java +++ b/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java @@ -1,4 +1,4 @@ -package org.jcnc.jnotepad; +package org.jcnc.jnotepad.view.manager; import javafx.geometry.Insets; import javafx.scene.Scene;