重构代码结构

This commit is contained in:
许轲 2023-08-12 11:37:05 +08:00
parent 8f18ba598b
commit 301fa25cb3
14 changed files with 96 additions and 75 deletions

View File

@ -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;
}

View File

@ -17,13 +17,12 @@ public interface ControllerInterface {
EventHandler<ActionEvent> getOpenFileEventHandler();
void autoSave(TextArea textArea);
EventHandler<ActionEvent> getSaveFileEventHandler();
EventHandler<ActionEvent> 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();
}

View File

@ -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);
}
}

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad;
package org.jcnc.jnotepad.constants;
/**
* Constants持有所有共享信息的全局变量

View File

@ -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<ActionEvent> {
public class LineFeed implements EventHandler<ActionEvent> {
private final TextArea textArea;
public LineFeedEventHandler(TextArea textArea) {
public LineFeed(TextArea textArea) {
this.textArea = textArea;
}
@Override

View File

@ -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<ActionEvent> {
public class NewFile implements EventHandler<ActionEvent> {
@Override
public void handle(ActionEvent event) {
Controller controller = new Controller();

View File

@ -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<ActionEvent> {
public class OpenFile implements EventHandler<ActionEvent> {
@Override
public void handle(ActionEvent event) {
Controller controller = new Controller();

View File

@ -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<ActionEvent> {
public class SaveAsFile implements EventHandler<ActionEvent> {
@Override
public void handle(ActionEvent event) {
Controller controller = new Controller();

View File

@ -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<ActionEvent> {
public class SaveFile implements EventHandler<ActionEvent> {
@Override
public void handle(ActionEvent event) {
Controller controller = new Controller();

View File

@ -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<ActionEvent> getLineFeedEventHandler(TextArea textArea) {
return new LineFeedEventHandler(textArea);
return new LineFeed(textArea);
}
@Override
public EventHandler<ActionEvent> getNewFileEventHandler(TextArea textArea) {
return new NewFileEventHandler();
return new NewFile();
}
@Override
public EventHandler<ActionEvent> getOpenFileEventHandler() {
return new OpenFileEventHandler();
return new OpenFile();
}
@Override
@ -65,12 +66,12 @@ public class Controller implements ControllerInterface {
@Override
public EventHandler<ActionEvent> getSaveFileEventHandler() {
return new SaveFileEventHandler();
return new SaveFile();
}
@Override
public EventHandler<ActionEvent> 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();
}
}

View File

@ -40,7 +40,6 @@ public class EncodingDetector {
byte[] bytes = text.getBytes(encoding);
String decoded = new String(bytes, encoding);
// 解码后的文本相同表示编码有效
return text.equals(decoded);
}

View File

@ -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());
}
});
}
}

View File

@ -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();
}
}

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad;
package org.jcnc.jnotepad.view.manager;
import javafx.geometry.Insets;
import javafx.scene.Scene;