diff --git a/.idea/artifacts/JNotepad_jar.xml b/.idea/artifacts/JNotepad_jar.xml
deleted file mode 100644
index b20fc00b22df11e4433bac33e84fe340828ebd35..0000000000000000000000000000000000000000
--- a/.idea/artifacts/JNotepad_jar.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
- $PROJECT_DIR$/out/artifacts/JNotepad_jar
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ee9f695f7ed33a023d8bfd88778b3717f7339f87
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index da9742786af0bd07b90f0eb085f9c708e7710860..8e852c2c411ff080642c5da74d52e17cb84b66ac 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -14,7 +14,7 @@
-
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index f1b4d35b98ec425650df524a3700c8423366f083..f9f34663d583a3a15a406c05685490908a0979ad 100644
--- a/pom.xml
+++ b/pom.xml
@@ -32,11 +32,15 @@
${junit.version}
test
+
+ cn.hutool
+ hutool-all
+ 5.8.20
+
-
org.apache.maven.plugins
maven-compiler-plugin
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 215f2c88ef880401cf864207ea8eb465cbe22e64..e927e2eb404b224c60f98f48796b7a6df2e13e63 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -1,6 +1,7 @@
module org.jcnc.jnotepad {
requires javafx.controls;
requires atlantafx.base;
+ requires cn.hutool;
exports org.jcnc.jnotepad;
exports org.jcnc.jnotepad.tool;
diff --git a/src/main/java/org/jcnc/jnotepad/Interface/ShortcutKeyInterface.java b/src/main/java/org/jcnc/jnotepad/Interface/ShortcutKeyInterface.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f8c52eb87632ab0eae2d856852408f316cef91d
--- /dev/null
+++ b/src/main/java/org/jcnc/jnotepad/Interface/ShortcutKeyInterface.java
@@ -0,0 +1,10 @@
+package org.jcnc.jnotepad.Interface;
+
+/**
+ * @author 一个大转盘
+ * @date 2023/8/18
+ */
+public interface ShortcutKeyInterface {
+ public void createShortcutKeyByConfig();
+
+}
diff --git a/src/main/java/org/jcnc/jnotepad/LunchApp.java b/src/main/java/org/jcnc/jnotepad/LunchApp.java
index 47bd934fe0d735d71b35eb128466e11e2f09313a..8093418015558db179c5b62ae9e317dd7129713a 100644
--- a/src/main/java/org/jcnc/jnotepad/LunchApp.java
+++ b/src/main/java/org/jcnc/jnotepad/LunchApp.java
@@ -50,13 +50,13 @@ public class LunchApp extends Application {
primaryStage.setScene(scene);
primaryStage.getIcons().add(new Image(Objects.requireNonNull(getClass().getResource(icon)).toString()));
primaryStage.show();
-
ViewManager viewManager = ViewManager.getInstance(scene);
viewManager.initScreen(scene);
// 初始化菜单项和标签栏
view.initItem();
view.initTabPane();
+ view.initShortcutKey();
if (isRelevance) {
// 使用线程池加载关联文件并创建文本区域
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 ab0bbb0fb96b20a62bfa0d16f4cc4be6fdfbb08f..ae1f9861d0f50b348c53782fb30e79b596eae73c 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
@@ -27,7 +27,10 @@ public class NewFile implements EventHandler {
// 创建一个新的文本编辑区
TextArea textArea = new TextArea();
-
+ textArea.setStyle(
+ "-fx-border-color:white;" +
+ "-fx-background-color:white"
+ );
// 创建一个新的Tab页
Tab tab = new Tab("新建文本 " + ++ViewManager.tabIndex);
tab.setContent(textArea);
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 e1945d9891114ae3324f6e8ac2825254abbb018a..210b955ee376bfbf3d17aabbeda7e5f4e86f0fe9 100644
--- a/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java
+++ b/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java
@@ -6,6 +6,8 @@ import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Tab;
import javafx.scene.control.TextArea;
+import javafx.scene.paint.Color;
+import javafx.scene.shape.Rectangle;
import org.jcnc.jnotepad.Interface.ControllerInterface;
import org.jcnc.jnotepad.LunchApp;
import org.jcnc.jnotepad.controller.event.handler.LineFeed;
@@ -158,6 +160,7 @@ public class Controller implements ControllerInterface {
Tab tab = createNewTab(file.getName(), textArea);
tab.setUserData(file);
ViewManager.tabPane.getTabs().add(tab);
+// ViewManager.tabPane.sets
ViewManager.tabPane.getSelectionModel().select(tab);
updateStatusLabel(textArea);
@@ -265,7 +268,12 @@ public class Controller implements ControllerInterface {
* @return 新的文本区域
*/
private TextArea createNewTextArea() {
- return new TextArea();
+ TextArea textArea = new TextArea();
+ textArea.setStyle(
+ "-fx-border-color:white;" +
+ "-fx-background-color:white"
+ );
+ return textArea;
}
/**
diff --git a/src/main/java/org/jcnc/jnotepad/controller/manager/ShortcutKey.java b/src/main/java/org/jcnc/jnotepad/controller/manager/ShortcutKey.java
new file mode 100644
index 0000000000000000000000000000000000000000..6b7e330b3eddeea3232cff99ca0d1a6f135ed215
--- /dev/null
+++ b/src/main/java/org/jcnc/jnotepad/controller/manager/ShortcutKey.java
@@ -0,0 +1,42 @@
+package org.jcnc.jnotepad.controller.manager;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import javafx.scene.control.Menu;
+import javafx.scene.control.MenuItem;
+import javafx.scene.input.KeyCombination;
+import org.jcnc.jnotepad.Interface.ShortcutKeyInterface;
+import org.jcnc.jnotepad.tool.FileUtil;
+import org.jcnc.jnotepad.view.manager.ViewManager;
+
+import java.io.File;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author 一个大转盘
+ * @date 2023/8/18
+ */
+public class ShortcutKey implements ShortcutKeyInterface {
+ @Override
+ public void createShortcutKeyByConfig() {
+ String json = "src/main/resources/config/shortcutKey.json";
+ File jsonFile = new File(json);
+ // 读取json文件
+ String jsonData = FileUtil.getJsonStr(jsonFile);
+ // 转json对象
+ JSONObject shortcutKeyConfig = JSONUtil.parseObj(jsonData);
+ for (Map.Entry stringObjectEntry : shortcutKeyConfig) {
+ // 保证json的key必须和变量名一致
+ MenuItem menuItem = ViewManager.itemMap.get(stringObjectEntry.getKey());
+ String shortKeyValue = stringObjectEntry.getValue().toString();
+ if (ObjectUtil.isNotEmpty(shortKeyValue)&&ObjectUtil.isNotEmpty(menuItem)) {
+ // 动态添加快捷键
+ menuItem.setAccelerator(KeyCombination.keyCombination(shortKeyValue));
+ }
+ }
+
+
+ }
+}
diff --git a/src/main/java/org/jcnc/jnotepad/tool/FileUtil.java b/src/main/java/org/jcnc/jnotepad/tool/FileUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb05b24e7a145b924c0f1929c6317120693df308
--- /dev/null
+++ b/src/main/java/org/jcnc/jnotepad/tool/FileUtil.java
@@ -0,0 +1,37 @@
+package org.jcnc.jnotepad.tool;
+
+import java.io.*;
+
+/**
+ * @author 一个大转盘
+ * @date 2023/8/18
+ */
+public class FileUtil {
+
+ /**
+ * 把一个文件中的内容读取成一个String字符串
+ * @date 2023/8/18 0:54
+ * @param jsonFile
+ * @return String
+ */
+ public static String getJsonStr(File jsonFile){
+ String jsonStr = "";
+ try {
+ FileReader fileReader = new FileReader(jsonFile);
+ Reader reader = new InputStreamReader(new FileInputStream(jsonFile),"utf-8");
+ int ch = 0;
+ StringBuffer sb = new StringBuffer();
+ while ((ch = reader.read()) != -1) {
+ sb.append((char) ch);
+ }
+ fileReader.close();
+ reader.close();
+ jsonStr = sb.toString();
+ return jsonStr;
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+}
diff --git a/src/main/java/org/jcnc/jnotepad/view/init/View.java b/src/main/java/org/jcnc/jnotepad/view/init/View.java
index ae9feaf8dc3765fe4f77f1f0d46708083beabd31..57438b41ba2a7ddf028358ce50b2d3a6c91a62f5 100644
--- a/src/main/java/org/jcnc/jnotepad/view/init/View.java
+++ b/src/main/java/org/jcnc/jnotepad/view/init/View.java
@@ -1,27 +1,42 @@
package org.jcnc.jnotepad.view.init;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.scene.Scene;
import javafx.scene.control.TextArea;
+import javafx.scene.input.KeyCode;
+import javafx.scene.input.KeyCodeCombination;
+import javafx.scene.input.KeyCombination;
import org.jcnc.jnotepad.controller.manager.Controller;
+import org.jcnc.jnotepad.controller.manager.ShortcutKey;
+
+import java.util.HashMap;
+import java.util.Map;
import static org.jcnc.jnotepad.view.manager.ViewManager.*;
public class View {
-
+ private static Map itmeMap = new HashMap<>();
public void initItem() {
// 初始化菜单项的事件处理器
- newItem.setOnAction(new Controller().getNewFileEventHandler(new TextArea()));
- openItem.setOnAction(new Controller().getOpenFileEventHandler());
- saveAsItem.setOnAction(new Controller().getSaveAsFileEventHandler());
+ EventHandler newFileEventHandler = new Controller().getNewFileEventHandler(new TextArea());
+ newItem.setOnAction(newFileEventHandler);
+ EventHandler openFileEventHandler = new Controller().getOpenFileEventHandler();
+ openItem.setOnAction(openFileEventHandler);
+ EventHandler saveAsFileEventHandler = new Controller().getSaveAsFileEventHandler();
+ saveAsItem.setOnAction(saveAsFileEventHandler);
lineFeedItem.setOnAction(new Controller().getLineFeedEventHandler(new TextArea()));
-
}
public void initTabPane() {
new Controller().initTabPane();
}
-
+ // 初始化快捷键
+ public void initShortcutKey(){
+ new ShortcutKey().createShortcutKeyByConfig();
+ }
}
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 85aaf1d8c4d33edd0019d86f403b729f454a2079..1609b92a271227ddab8b4cdce25144594ef78405 100644
--- a/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java
+++ b/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java
@@ -3,9 +3,13 @@ package org.jcnc.jnotepad.view.manager;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
+import javafx.scene.input.KeyCombination;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
+import java.util.HashMap;
+import java.util.Map;
+
/**
* 该类管理记事本应用程序的视图组件。
*/
@@ -20,7 +24,7 @@ public class ViewManager {
// 菜单栏组件
public static MenuBar menuBar; //菜单栏
public static Menu fileMenu, setMenu, pluginMenu; //文件菜单//设置菜单//插件菜单 菜单
- public static MenuItem newItem, openItem, saveAsItem, addItem, coutItem; //新建/打开/保存/保存至//增加//查看 菜单按钮
+ public static MenuItem newItem, openItem, saveAsItem, addItem, countItem; //新建/打开/保存/保存至//增加//查看 菜单按钮
public static CheckMenuItem lineFeedItem; //自动换行点击菜单按钮
// 主界面布局
@@ -34,6 +38,8 @@ public class ViewManager {
private static ViewManager instance = null;
+ public static Map itemMap = new HashMap<>();
+
/**
* 获取ViewManager的实例。如果实例不存在,则创建一个新实例。
*
@@ -68,15 +74,23 @@ public class ViewManager {
//文件菜单
fileMenu = new Menu("文件");
+
newItem = new MenuItem("新建");
+ itemMap.put("newItem", newItem);
+
openItem = new MenuItem("打开");
+ itemMap.put("openItem", openItem);
+
saveAsItem = new MenuItem("另存为");
+ itemMap.put("saveAsItem", saveAsItem);
fileMenu.getItems().addAll(newItem, openItem, saveAsItem);
//设置菜单
setMenu = new Menu("设置");
+
lineFeedItem = new CheckMenuItem("自动换行");
+ itemMap.put("lineFeedItem", lineFeedItem);
lineFeedItem.selectedProperty().set(true);
setMenu.getItems().addAll(lineFeedItem);
@@ -84,9 +98,12 @@ public class ViewManager {
//插件菜单
pluginMenu = new Menu("插件");
addItem = new MenuItem("增加插件");
- coutItem = new MenuItem("统计字数");
+ itemMap.put("addItem", addItem);
+
+ countItem = new MenuItem("统计字数");
+ itemMap.put("countItem", countItem);
- pluginMenu.getItems().addAll(addItem, coutItem);
+ pluginMenu.getItems().addAll(addItem, countItem);
//菜单栏
menuBar.getMenus().addAll(fileMenu, setMenu, pluginMenu);
diff --git a/src/main/resources/config/shortcutKey.json b/src/main/resources/config/shortcutKey.json
new file mode 100644
index 0000000000000000000000000000000000000000..2916f3f3045628a2798336e8e8826e12bf41d450
--- /dev/null
+++ b/src/main/resources/config/shortcutKey.json
@@ -0,0 +1,10 @@
+{
+ "newItem": "ctrl+n",
+ "openItem": "ctrl+o",
+ "saveAsItem": "ctrl+shift+s",
+
+ "lineFeedItem": "",
+
+ "addItem": "",
+ "countItem": ""
+}
\ No newline at end of file