From 108c4ebe5cc434c0910570445438361f20fc09ee Mon Sep 17 00:00:00 2001 From: lixinpiao Date: Sat, 12 Aug 2023 15:47:07 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=A1=8C=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 +- .../Interface/ControllerInterface.java | 3 - src/main/java/org/jcnc/jnotepad/LunchApp.java | 8 +- .../org/jcnc/jnotepad/component/JTab.java | 112 ++++++++++++++++++ .../controller/event/handler/NewFile.java | 5 +- .../controller/manager/Controller.java | 43 +++---- .../java/org/jcnc/jnotepad/utils/StrUtil.java | 20 ++++ .../jnotepad/view/manager/ViewManager.java | 2 + 8 files changed, 158 insertions(+), 39 deletions(-) create mode 100644 src/main/java/org/jcnc/jnotepad/component/JTab.java create mode 100644 src/main/java/org/jcnc/jnotepad/utils/StrUtil.java diff --git a/pom.xml b/pom.xml index e98824d..3b2892a 100644 --- a/pom.xml +++ b/pom.xml @@ -10,8 +10,10 @@ JNotepad - UTF-8 5.9.2 + UTF-8 + ${encoding} + ${encoding} diff --git a/src/main/java/org/jcnc/jnotepad/Interface/ControllerInterface.java b/src/main/java/org/jcnc/jnotepad/Interface/ControllerInterface.java index 19ec32b..3bfea21 100644 --- a/src/main/java/org/jcnc/jnotepad/Interface/ControllerInterface.java +++ b/src/main/java/org/jcnc/jnotepad/Interface/ControllerInterface.java @@ -21,11 +21,8 @@ public interface ControllerInterface { EventHandler getSaveAsFileEventHandler(); - void autoSave(TextArea textArea); - void updateStatusLabel(TextArea textArea); - void openAssociatedFile(String filePath); void getText(File file); diff --git a/src/main/java/org/jcnc/jnotepad/LunchApp.java b/src/main/java/org/jcnc/jnotepad/LunchApp.java index 8c15be0..6083d2e 100644 --- a/src/main/java/org/jcnc/jnotepad/LunchApp.java +++ b/src/main/java/org/jcnc/jnotepad/LunchApp.java @@ -3,11 +3,15 @@ package org.jcnc.jnotepad; import javafx.application.Application; import javafx.application.Platform; import javafx.scene.Scene; +import javafx.scene.control.Label; import javafx.scene.control.Tab; import javafx.scene.control.TextArea; import javafx.scene.image.Image; +import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; +import javafx.scene.layout.VBox; import javafx.stage.Stage; +import org.jcnc.jnotepad.component.JTab; import org.jcnc.jnotepad.constants.Constants; import org.jcnc.jnotepad.controller.manager.Controller; import org.jcnc.jnotepad.view.manager.ViewManager; @@ -62,11 +66,9 @@ public class LunchApp extends Application { } private void updateUIWithNewTextArea(TextArea textArea) { - Tab tab = new Tab("新建文件 " + (++ViewManager.tabIndex)); - tab.setContent(textArea); + JTab tab = new JTab("新建文件 " + (++ViewManager.tabIndex),textArea); ViewManager.tabPane.getTabs().add(tab); ViewManager.tabPane.getSelectionModel().select(tab); - controller.updateStatusLabel(textArea); } @Override diff --git a/src/main/java/org/jcnc/jnotepad/component/JTab.java b/src/main/java/org/jcnc/jnotepad/component/JTab.java new file mode 100644 index 0000000..e6fc91e --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/component/JTab.java @@ -0,0 +1,112 @@ +package org.jcnc.jnotepad.component; + +import javafx.geometry.Pos; +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.control.Tab; +import javafx.scene.control.TextArea; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import org.jcnc.jnotepad.constants.Constants; +import org.jcnc.jnotepad.controller.manager.Controller; +import org.jcnc.jnotepad.utils.StrUtil; + +import static org.jcnc.jnotepad.view.manager.ViewManager.statusLabel; + +/** + * @Description + * @Author lixinpiao + * @Date 2023/8/12 14:19 + **/ +public class JTab extends Tab { + + /** + * 行号区域 + */ + private VBox lineNum; + + /** + * 文本区域 + */ + private TextArea textArea; + + private JTab() { + super(); + } + + public JTab(String s) { + super(s); + } + + public JTab(String s, TextArea node) { + super(s, node); + this.init(node); + } + + public void init(TextArea textArea){ + + Controller controller= new Controller(); + VBox vBox = new VBox(); + //vBox.getChildren().addAll(labels); + vBox.setPrefWidth(60); + this.setLineNum(vBox); + + double width = Constants.SCREEN_WIDTH; + textArea.setPrefWidth(width); + this.setTextArea(textArea); + HBox hBox = new HBox(); + hBox.getChildren().addAll(this.getLineNum(),this.getTextArea()); + this.setContent(hBox); + + controller.configureTextArea(textArea); + + updateRowAndColumn(); + + textArea.textProperty().addListener((observable, oldValue, newValue) ->updateRowAndColumn()); + } + + public void updateRowAndColumn(){ + Controller controller= new Controller(); + + int allRow = this.getAllRaw(); + Label[] labels = new Label[allRow]; + for(int i=0;i { public void handle(ActionEvent event) { Controller controller = new Controller(); TextArea textArea = new TextArea(); // 创建新的文本编辑区 - Tab tab = new Tab("新建文本 " + ++ViewManager.tabIndex); // 创建新的Tab页 - tab.setContent(textArea); + JTab tab = new JTab("新建文本 " + ++ViewManager.tabIndex,textArea); // 创建新的Tab页 tabPane.getTabs().add(tab); tabPane.getSelectionModel().select(tab); - controller.updateStatusLabel(textArea); // 更新编码信息 controller.upDateEncodingLabel(textArea.getText()); // 更新文本编码信息 } diff --git a/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java b/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java index 6fd4231..75e73bc 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java +++ b/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java @@ -4,12 +4,17 @@ import javafx.application.Platform; import javafx.concurrent.Task; import javafx.event.ActionEvent; import javafx.event.EventHandler; +import javafx.scene.control.Label; import javafx.scene.control.Tab; import javafx.scene.control.TextArea; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; import javafx.stage.FileChooser; import org.jcnc.jnotepad.Interface.ControllerInterface; import org.jcnc.jnotepad.LunchApp; +import org.jcnc.jnotepad.component.JTab; import org.jcnc.jnotepad.controller.event.handler.*; +import org.jcnc.jnotepad.view.manager.ViewManager; import java.io.*; import java.util.List; @@ -27,7 +32,6 @@ public class Controller implements ControllerInterface { } TextArea textArea = createNewTextArea(); - configureTextArea(textArea); return textArea; } @@ -88,15 +92,6 @@ public class Controller implements ControllerInterface { } } - @Override - public void updateStatusLabel(TextArea textArea) { - int caretPosition = textArea.getCaretPosition(); - int row = getRow(caretPosition, textArea.getText()); - int column = getColumn(caretPosition, textArea.getText()); - int length = textArea.getLength(); - statusLabel.setText("行: " + row + " \t列: " + column + " \t字数: " + length); - } - @Override public void openAssociatedFile(String filePath) { File file = new File(filePath); @@ -116,15 +111,11 @@ public class Controller implements ControllerInterface { textBuilder.append(line).append("\n"); } String text = textBuilder.toString(); - Platform.runLater(() -> { textArea.setText(text); - - Tab tab = createNewTab(file.getName(), textArea); + JTab tab = new JTab(file.getName(),textArea); tabPane.getTabs().add(tab); tabPane.getSelectionModel().select(tab); - updateStatusLabel(textArea); - autoSave(textArea); }); } catch (IOException ignored) { @@ -162,15 +153,12 @@ public class Controller implements ControllerInterface { tabPane.getSelectionModel().selectedItemProperty().addListener((observable, oldTab, newTab) -> { if (newTab != null) { + JTab jtab = (JTab) newTab; // 获取新选定的标签页并关联的文本区域 - TextArea textArea = (TextArea) newTab.getContent(); - - // 更新状态标签 - controller.updateStatusLabel(textArea); - + HBox hBox = (HBox) jtab.getContent(); + TextArea textArea = (TextArea) hBox.getChildren().get(1); // 监听文本光标位置的变化,更新状态标签 - textArea.caretPositionProperty().addListener((caretObservable, oldPosition, newPosition) -> controller.updateStatusLabel(textArea)); - + textArea.caretPositionProperty().addListener((caretObservable, oldPosition, newPosition) -> jtab.updateRowAndColumn()); // 更新编码标签 controller.upDateEncodingLabel(textArea.getText()); } @@ -178,13 +166,10 @@ public class Controller implements ControllerInterface { } - private void configureTextArea(TextArea textArea) { + public void configureTextArea(TextArea textArea) { textArea.setWrapText(true); + textArea.setStyle("-fx-focus-traversable: false"); upDateEncodingLabel(textArea.getText()); - updateStatusLabel(textArea); - - textArea.textProperty().addListener((observable, oldValue, newValue) -> updateStatusLabel(textArea)); - autoSave(textArea); } @@ -192,8 +177,8 @@ public class Controller implements ControllerInterface { return new TextArea(); } - private Tab createNewTab(String tabName, TextArea textArea) { - Tab tab = new Tab(tabName); + private JTab createNewTab(String tabName, TextArea textArea) { + JTab tab = new JTab(tabName); tab.setContent(textArea); tab.setUserData(null); return tab; diff --git a/src/main/java/org/jcnc/jnotepad/utils/StrUtil.java b/src/main/java/org/jcnc/jnotepad/utils/StrUtil.java new file mode 100644 index 0000000..c28e229 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/utils/StrUtil.java @@ -0,0 +1,20 @@ +package org.jcnc.jnotepad.utils; + +/** + * @Description + * @Author lixinpiao + * @Date 2023/8/12 15:05 + **/ +public class StrUtil { + + public static int countCharacters(String str, char target) { + int count = 0; + char[] chars = str.toCharArray(); + for (char aChar : chars) { + if (aChar == target) { + count++; + } + } + return count; + } +} 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 845fb82..cbda1a8 100644 --- a/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java +++ b/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java @@ -5,6 +5,7 @@ import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; /** * 该类管理记事本应用程序的视图组件。 @@ -32,6 +33,7 @@ public class ViewManager { // 状态栏 public static Label statusLabel; + private static ViewManager instance = null; /** -- Gitee From fea237e677da40e598f3eb2c0433c6d52ef85288 Mon Sep 17 00:00:00 2001 From: lixinpiao Date: Sat, 12 Aug 2023 16:04:00 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=B7=A6=E4=BE=A7?= =?UTF-8?q?=E8=A1=8C=E5=8F=B7=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/jcnc/jnotepad/component/JTab.java | 3 +++ .../jcnc/jnotepad/controller/manager/Controller.java | 2 +- src/main/resources/css/text-area.css | 12 ++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/css/text-area.css diff --git a/src/main/java/org/jcnc/jnotepad/component/JTab.java b/src/main/java/org/jcnc/jnotepad/component/JTab.java index e6fc91e..b0db21e 100644 --- a/src/main/java/org/jcnc/jnotepad/component/JTab.java +++ b/src/main/java/org/jcnc/jnotepad/component/JTab.java @@ -65,6 +65,9 @@ public class JTab extends Tab { textArea.textProperty().addListener((observable, oldValue, newValue) ->updateRowAndColumn()); } + /** + * 更新行列状态栏 + */ public void updateRowAndColumn(){ Controller controller= new Controller(); diff --git a/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java b/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java index 75e73bc..3be8f00 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java +++ b/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java @@ -7,6 +7,7 @@ import javafx.event.EventHandler; import javafx.scene.control.Label; import javafx.scene.control.Tab; import javafx.scene.control.TextArea; +import javafx.scene.layout.Border; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.FileChooser; @@ -168,7 +169,6 @@ public class Controller implements ControllerInterface { public void configureTextArea(TextArea textArea) { textArea.setWrapText(true); - textArea.setStyle("-fx-focus-traversable: false"); upDateEncodingLabel(textArea.getText()); autoSave(textArea); } diff --git a/src/main/resources/css/text-area.css b/src/main/resources/css/text-area.css new file mode 100644 index 0000000..b239fc2 --- /dev/null +++ b/src/main/resources/css/text-area.css @@ -0,0 +1,12 @@ +.text-area{ + -fx-background-insets: 0; + -fx-background-color: transparent, white, transparent, white; +} + +.text-area .content { + -fx-background-color: transparent, white, transparent, white; +} + +.text-area:focused { + -fx-background-color: transparent, white, transparent, white; +} \ No newline at end of file -- Gitee