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