!165 ️ 优化快捷键初始化

Merge pull request !165 from 格物方能致知/develop
This commit is contained in:
格物方能致知 2023-10-13 08:42:19 +00:00 committed by Gitee
commit 5659fc8591
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
14 changed files with 206 additions and 114 deletions

View File

@ -26,12 +26,16 @@ public class JnotepadApp extends Application {
} }
@Override @Override
public void start(Stage primaryStage) { public void init() {
// 获取当前启动位置a // 获取当前启动位置a
String currentWorkingDirectory = System.getProperty("user.dir"); String currentWorkingDirectory = System.getProperty("user.dir");
LogUtil.getLogger(this.getClass()).info("当前启动位置:{}", currentWorkingDirectory); LogUtil.getLogger(this.getClass()).info("当前启动位置:{}", currentWorkingDirectory);
// 设置参数 // 设置参数
APPLICATION_MANAGER.setApplication(this); APPLICATION_MANAGER.setApplication(this);
}
@Override
public void start(Stage primaryStage) {
APPLICATION_MANAGER.setPrimaryStage(primaryStage); APPLICATION_MANAGER.setPrimaryStage(primaryStage);
// 加载应用程序资源 // 加载应用程序资源
APPLICATION_MANAGER.loadAppResources(); APPLICATION_MANAGER.loadAppResources();

View File

@ -0,0 +1,65 @@
package org.jcnc.jnotepad.api.core.views.menu;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.controller.config.UserConfigController;
import org.jcnc.jnotepad.ui.views.root.top.menubar.TopMenuBar;
import java.util.HashMap;
import java.util.Map;
/**
* 抽象基础菜单类
*
* <p>
* 此抽象类用于创建基础菜单包括菜单项的注册和初始化
* </p>
*
* @author gewuyou
*/
public abstract class AbstractBaseMenu extends AbstractMenu<Menu> {
protected final TopMenuBar topMenuBar = TopMenuBar.getInstance();
protected final UserConfigController userConfigController = UserConfigController.getInstance();
/**
* 获取菜单名称
*
* @return 菜单名称
*/
public abstract String getMenuName();
/**
* 初始化菜单项
*
* @param menuItems 菜单项集合
* @param menu 菜单
*/
@Override
protected void initMenuItems(Map<String, MenuItem> menuItems, Menu menu) {
logger.info("初始化菜单项!");
Map<String, MenuItem> menuItemMap = new HashMap<>(16);
// 本地化
menuItems.forEach((key, value) -> {
UiResourceBundle.bindStringProperty(value.textProperty(), key);
menuItemMap.put((String) value.getUserData(), value);
menu.getItems().add(value);
});
userConfigController.getMenuItems().add(menuItemMap);
userConfigController.initShortcutKeys(menuItemMap);
}
/**
* 初始化菜单栏
*/
@Override
public void initMenu() {
registerMenu();
logger.info("初始化菜单!");
Menu menu = getMenu();
// 菜单名称国际化
UiResourceBundle.bindStringProperty(menu.textProperty(), getMenuName());
// 初始化菜单项
initMenuItems(getMenuItems(), menu);
}
}

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad.api.core.views.top.menu; package org.jcnc.jnotepad.api.core.views.menu;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
@ -7,40 +7,25 @@ import javafx.scene.control.CheckMenuItem;
import javafx.scene.control.Menu; import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem; import javafx.scene.control.MenuItem;
import javafx.scene.control.RadioMenuItem; import javafx.scene.control.RadioMenuItem;
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.app.utils.LogUtil; import org.jcnc.jnotepad.app.utils.LogUtil;
import org.jcnc.jnotepad.ui.views.root.top.menubar.TopMenuBar;
import org.slf4j.Logger; import org.slf4j.Logger;
import java.util.Map; import java.util.Map;
/** /**
* 抽象顶部菜单类 * 抽象菜单类
*
* <p>
* 此抽象类用于创建顶部菜单包括菜单项的注册和初始化
* </p>
* *
* @author gewuyou * @author gewuyou
*/ */
public abstract class AbstractTopMenu { public abstract class AbstractMenu<T> {
protected final TopMenuBar topMenuBar = TopMenuBar.getInstance();
protected Logger logger = LogUtil.getLogger(this.getClass()); protected Logger logger = LogUtil.getLogger(this.getClass());
/**
* 获取菜单名称
*
* @return 菜单名称
*/
public abstract String getMenuName();
/** /**
* 获取菜单 * 获取菜单
* *
* @return 菜单 * @return 菜单
*/ */
public abstract Menu getMenu(); public abstract T getMenu();
/** /**
* 获取菜单项集合 * 获取菜单项集合
@ -50,9 +35,15 @@ public abstract class AbstractTopMenu {
public abstract Map<String, MenuItem> getMenuItems(); public abstract Map<String, MenuItem> getMenuItems();
/** /**
* 注册顶部菜单 * 注册菜单
*/ */
protected abstract void registerTopMenu(); protected abstract void registerMenu();
/**
* 初始化菜单
*/
protected abstract void initMenu();
/** /**
* 注册菜单项 * 注册菜单项
@ -68,6 +59,20 @@ public abstract class AbstractTopMenu {
menuItem.setOnAction(eventHandler); menuItem.setOnAction(eventHandler);
} }
/**
* 注册菜单项
*
* @param menuItem 菜单项
* @param menuItemName 菜单项名称
* @param userData 用户数据用来存放必要的数据比如按钮菜单项名称
* @param eventHandler 事件处理器
*/
public void registerMenuItem(MenuItem menuItem, String menuItemName, Object userData, EventHandler<ActionEvent> eventHandler, boolean isDisable) {
if (!isDisable) {
registerMenuItem(menuItem, menuItemName, userData, eventHandler);
}
}
/** /**
* 注册检查菜单项 * 注册检查菜单项
* *
@ -82,6 +87,32 @@ public abstract class AbstractTopMenu {
checkMenuItem.selectedProperty().addListener(listener); checkMenuItem.selectedProperty().addListener(listener);
} }
/**
* 在给定菜单映射中注册具有指定名称用户数据和事件处理程序的菜单项
*
* @param menu 菜单项映射
* @param menuItemName 要注册的菜单项的名称
* @param userData 与菜单项关联的用户数据
*/
public void registerMenu(Menu menu, String menuItemName, Object userData) {
getMenuItems().put(menuItemName, menu);
menu.setUserData(userData);
}
/**
* Registers a menu item in the specified menu with the given name and user data.
*
* @param menu the menu to register the item in
* @param menuItemName the name of the menu item
* @param userData the user data associated with the menu item
* @param isDisable whether the menu item is disabled
*/
public void registerMenu(Menu menu, String menuItemName, Object userData, boolean isDisable) {
if (!isDisable) {
registerMenu(menu, menuItemName, userData);
}
}
/** /**
* 注册单选菜单项 * 注册单选菜单项
* *
@ -96,32 +127,12 @@ public abstract class AbstractTopMenu {
radioMenuItem.setOnAction(eventHandler); radioMenuItem.setOnAction(eventHandler);
} }
/**
* 初始化菜单栏
*/
public void initMenu() {
registerTopMenu();
logger.info("初始化菜单!");
Menu menu = getMenu();
// 菜单名称国际化
UiResourceBundle.bindStringProperty(menu.textProperty(), getMenuName());
// 初始化菜单项
initMenuItems(getMenuItems(), menu);
}
/** /**
* 初始化菜单项 * 初始化菜单项
* *
* @param menuItems 菜单项集合 * @param menuItems 菜单项集合
* @param menu 菜单 * @param menu 菜单
*/ */
private void initMenuItems(Map<String, MenuItem> menuItems, Menu menu) { protected abstract void initMenuItems(Map<String, MenuItem> menuItems, T menu);
logger.info("初始化菜单项!");
var itemMap = topMenuBar.getAllItemMap();
menuItems.forEach((key, value) -> {
UiResourceBundle.bindStringProperty(value.textProperty(), key);
itemMap.put((String) value.getUserData(), value);
menu.getItems().add(value);
});
}
} }

View File

@ -19,7 +19,6 @@ import org.jcnc.jnotepad.ui.component.module.TextCodeArea;
import org.jcnc.jnotepad.ui.component.stage.dialog.factory.impl.BasicFileChooserFactory; import org.jcnc.jnotepad.ui.component.stage.dialog.factory.impl.BasicFileChooserFactory;
import org.jcnc.jnotepad.ui.views.manager.BottomStatusBoxManager; import org.jcnc.jnotepad.ui.views.manager.BottomStatusBoxManager;
import org.jcnc.jnotepad.ui.views.manager.CenterTabPaneManager; import org.jcnc.jnotepad.ui.views.manager.CenterTabPaneManager;
import org.jcnc.jnotepad.ui.views.manager.TopMenuBarManager;
import org.jcnc.jnotepad.ui.views.root.center.main.center.tab.CenterTab; import org.jcnc.jnotepad.ui.views.root.center.main.center.tab.CenterTab;
import org.jcnc.jnotepad.ui.views.root.center.main.center.tab.CenterTabPane; import org.jcnc.jnotepad.ui.views.root.center.main.center.tab.CenterTabPane;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -63,7 +62,7 @@ public class TabUtil {
if (CONFIG_NAME.equals(tab.getText())) { if (CONFIG_NAME.equals(tab.getText())) {
// 重新加载语言包和快捷键 // 重新加载语言包和快捷键
UserConfigController.getInstance().loadConfig(); UserConfigController.getInstance().loadConfig();
TopMenuBarManager.getInstance().initShortcutKeys(); UserConfigController.getInstance().initAllShortcutKeys();
LocalizationController.initLocal(); LocalizationController.initLocal();
logger.info("已刷新语言包!"); logger.info("已刷新语言包!");
logger.info("已刷新快捷键!"); logger.info("已刷新快捷键!");
@ -365,13 +364,9 @@ public class TabUtil {
.addMenu( .addMenu(
new MenuBuilder("复制") new MenuBuilder("复制")
.addMenuItem("文件名", e -> { .addMenuItem("文件名", e -> {
ClipboardUtil.writeTextToClipboard(tab.getText()); ClipboardUtil.writeTextToClipboard(file.getName());
NotificationUtil.infoNotification("已复制文件名!"); NotificationUtil.infoNotification("已复制文件名!");
}, tab.isRelevance()) }, tab.isRelevance())
.addMenuItem("标签页名", e -> {
ClipboardUtil.writeTextToClipboard(tab.getText());
NotificationUtil.infoNotification("已复制标签页名!");
}, !tab.isRelevance())
.addMenuItem("文件路径", e -> { .addMenuItem("文件路径", e -> {
ClipboardUtil.writeTextToClipboard(file.getAbsolutePath()); ClipboardUtil.writeTextToClipboard(file.getAbsolutePath());
NotificationUtil.infoNotification("已复制文件路径!"); NotificationUtil.infoNotification("已复制文件路径!");

View File

@ -1,12 +1,17 @@
package org.jcnc.jnotepad.controller.config; package org.jcnc.jnotepad.controller.config;
import javafx.scene.control.MenuItem;
import javafx.scene.input.KeyCombination;
import org.jcnc.jnotepad.api.core.controller.config.BaseConfigController; import org.jcnc.jnotepad.api.core.controller.config.BaseConfigController;
import org.jcnc.jnotepad.app.config.UserConfig; import org.jcnc.jnotepad.app.config.UserConfig;
import org.jcnc.jnotepad.app.utils.LogUtil;
import org.jcnc.jnotepad.model.entity.ShortcutKey; import org.jcnc.jnotepad.model.entity.ShortcutKey;
import org.slf4j.Logger;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import static org.jcnc.jnotepad.app.common.constants.AppConstants.PROGRAM_FILE_DIRECTORY; import static org.jcnc.jnotepad.app.common.constants.AppConstants.PROGRAM_FILE_DIRECTORY;
import static org.jcnc.jnotepad.app.common.constants.TextConstants.CHINESE; import static org.jcnc.jnotepad.app.common.constants.TextConstants.CHINESE;
@ -31,11 +36,16 @@ public class UserConfigController extends BaseConfigController<UserConfig> {
private static final UserConfigController INSTANCE = new UserConfigController(); private static final UserConfigController INSTANCE = new UserConfigController();
private String configDir; private String configDir;
private final List<Map<String, MenuItem>> menuItems = new ArrayList<>();
Logger logger = LogUtil.getLogger(this.getClass());
private UserConfigController() { private UserConfigController() {
configDir = Paths.get(AppConfigController.getInstance().getConfig().getRootPath(), PROGRAM_FILE_DIRECTORY, ROOT_CONFIG_DIR).toString(); configDir = Paths.get(AppConfigController.getInstance().getConfig().getRootPath(), PROGRAM_FILE_DIRECTORY, ROOT_CONFIG_DIR).toString();
loadConfig(); loadConfig();
} }
/** /**
* 获取 UserConfigController 的实例 * 获取 UserConfigController 的实例
* *
@ -164,4 +174,35 @@ public class UserConfigController extends BaseConfigController<UserConfig> {
return getConfig().getShortcutKey(); return getConfig().getShortcutKey();
} }
public void initAllShortcutKeys() {
menuItems.forEach(this::initShortcutKeys);
}
/**
* 初始化快捷键
*/
public void initShortcutKeys(Map<String, MenuItem> menuItemMap) {
List<MenuItem> itemsToUnbind = new ArrayList<>();
List<ShortcutKey> shortcutKeyConfigs = getShortcutKey();
for (ShortcutKey shortcutKey : shortcutKeyConfigs) {
// 保证json的key必须和变量名一致
MenuItem menuItem = menuItemMap.get(shortcutKey.getButtonName());
String shortKeyValue = shortcutKey.getShortcutKeyValue();
if ("".equals(shortKeyValue) && menuItem != null) {
itemsToUnbind.add(menuItem);
continue;
}
if (menuItem != null) {
logger.info("功能名称:{}->快捷键:{}", menuItem.getText(), shortKeyValue);
// 动态添加快捷键
menuItem.setAccelerator(KeyCombination.keyCombination(shortKeyValue));
}
}
// 解绑需要解绑的快捷键
itemsToUnbind.forEach(menuItem -> menuItem.setAccelerator(null));
}
public List<Map<String, MenuItem>> getMenuItems() {
return menuItems;
}
} }

View File

@ -3,12 +3,9 @@ package org.jcnc.jnotepad.ui.views.manager;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import javafx.scene.control.Menu; import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import javafx.scene.input.KeyCombination;
import org.jcnc.jnotepad.api.core.views.manager.AbstractManager; import org.jcnc.jnotepad.api.core.views.manager.AbstractManager;
import org.jcnc.jnotepad.app.utils.LogUtil; import org.jcnc.jnotepad.app.utils.LogUtil;
import org.jcnc.jnotepad.controller.config.UserConfigController; import org.jcnc.jnotepad.controller.config.UserConfigController;
import org.jcnc.jnotepad.model.entity.ShortcutKey;
import org.jcnc.jnotepad.ui.views.root.top.menubar.TopMenuBar; import org.jcnc.jnotepad.ui.views.root.top.menubar.TopMenuBar;
import org.jcnc.jnotepad.ui.views.root.top.menubar.menu.*; import org.jcnc.jnotepad.ui.views.root.top.menubar.menu.*;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -28,6 +25,7 @@ public class TopMenuBarManager extends AbstractManager<Menu> {
Logger logger = LogUtil.getLogger(this.getClass()); Logger logger = LogUtil.getLogger(this.getClass());
UserConfigController userConfigController = UserConfigController.getInstance(); UserConfigController userConfigController = UserConfigController.getInstance();
FileTopMenu fileTopMenu = FileTopMenu.getInstance(); FileTopMenu fileTopMenu = FileTopMenu.getInstance();
LanguageTopMenu languageTopMenu = LanguageTopMenu.getInstance(); LanguageTopMenu languageTopMenu = LanguageTopMenu.getInstance();
@ -63,13 +61,12 @@ public class TopMenuBarManager extends AbstractManager<Menu> {
helpTopMenu.initMenu(); helpTopMenu.initMenu();
// 初始化插件菜单 // 初始化插件菜单
pluginTopMenu.initMenu(); pluginTopMenu.initMenu();
// 初始化运行菜单
runTopMenu.initMenu(); runTopMenu.initMenu();
// 刷新顶部菜单栏 // 刷新顶部菜单栏
refreshTopMenuBar(); refreshTopMenuBar();
// 初始化快捷键
initShortcutKeys();
} }
/** /**
@ -93,30 +90,6 @@ public class TopMenuBarManager extends AbstractManager<Menu> {
} }
/**
* 初始化快捷键
*/
public void initShortcutKeys() {
List<MenuItem> itemsToUnbind = new ArrayList<>();
List<ShortcutKey> shortcutKeyConfigs = userConfigController.getShortcutKey();
for (ShortcutKey shortcutKey : shortcutKeyConfigs) {
// 保证json的key必须和变量名一致
MenuItem menuItem = topMenuBar.getAllItemMap().get(shortcutKey.getButtonName());
String shortKeyValue = shortcutKey.getShortcutKeyValue();
if ("".equals(shortKeyValue) && menuItem != null) {
itemsToUnbind.add(menuItem);
continue;
}
if (menuItem != null) {
logger.info("功能名称:{}->快捷键:{}", menuItem.getText(), shortKeyValue);
// 动态添加快捷键
menuItem.setAccelerator(KeyCombination.keyCombination(shortKeyValue));
}
}
// 解绑需要解绑的快捷键
itemsToUnbind.forEach(menuItem -> menuItem.setAccelerator(null));
}
/** /**
* 刷新顶部菜单 * 刷新顶部菜单
*/ */

View File

@ -4,9 +4,6 @@ import javafx.scene.control.*;
import org.jcnc.jnotepad.ui.views.manager.CenterTabPaneManager; import org.jcnc.jnotepad.ui.views.manager.CenterTabPaneManager;
import org.jcnc.jnotepad.ui.views.root.center.main.center.tab.CenterTab; import org.jcnc.jnotepad.ui.views.root.center.main.center.tab.CenterTab;
import java.util.HashMap;
import java.util.Map;
/** /**
* 封装菜单栏组件 * 封装菜单栏组件
* *
@ -15,10 +12,6 @@ import java.util.Map;
public class TopMenuBar extends MenuBar { public class TopMenuBar extends MenuBar {
private static final TopMenuBar MENU_BAR = new TopMenuBar(); private static final TopMenuBar MENU_BAR = new TopMenuBar();
/**
* 按钮集合
*/
private final Map<String, MenuItem> allItemMap = new HashMap<>();
/** /**
* 标签页布局组件封装 * 标签页布局组件封装
*/ */
@ -153,8 +146,6 @@ public class TopMenuBar extends MenuBar {
return helpMenu; return helpMenu;
} }
public Menu getPluginMenu() { public Menu getPluginMenu() {
return pluginMenu; return pluginMenu;
} }
@ -164,9 +155,6 @@ public class TopMenuBar extends MenuBar {
return languageMenu; return languageMenu;
} }
public Map<String, MenuItem> getAllItemMap() {
return allItemMap;
}
public MenuItem getNewItem() { public MenuItem getNewItem() {
return newItem; return newItem;

View File

@ -2,7 +2,7 @@ package org.jcnc.jnotepad.ui.views.root.top.menubar.menu;
import javafx.scene.control.Menu; import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem; import javafx.scene.control.MenuItem;
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu; import org.jcnc.jnotepad.api.core.views.menu.AbstractBaseMenu;
import org.jcnc.jnotepad.controller.event.handler.menuitem.*; import org.jcnc.jnotepad.controller.event.handler.menuitem.*;
import org.jcnc.jnotepad.controller.event.handler.toolbar.OpenDirectory; import org.jcnc.jnotepad.controller.event.handler.toolbar.OpenDirectory;
@ -16,7 +16,7 @@ import static org.jcnc.jnotepad.app.common.constants.TextConstants.*;
* *
* @author gewuyou * @author gewuyou
*/ */
public class FileTopMenu extends AbstractTopMenu { public class FileTopMenu extends AbstractBaseMenu {
private static final FileTopMenu INSTANCE = new FileTopMenu(); private static final FileTopMenu INSTANCE = new FileTopMenu();
private final Map<String, MenuItem> fileMenuItems = new HashMap<>(); private final Map<String, MenuItem> fileMenuItems = new HashMap<>();
@ -59,7 +59,7 @@ public class FileTopMenu extends AbstractTopMenu {
* 注册顶部菜单 * 注册顶部菜单
*/ */
@Override @Override
protected void registerTopMenu() { protected void registerMenu() {
// 文件菜单 // 文件菜单
registerMenuItem(topMenuBar.getNewItem(), NEW, "newItem", new NewFile()); registerMenuItem(topMenuBar.getNewItem(), NEW, "newItem", new NewFile());
registerMenuItem(topMenuBar.getOpenItem(), OPEN, "openItem", new OpenFile()); registerMenuItem(topMenuBar.getOpenItem(), OPEN, "openItem", new OpenFile());

View File

@ -3,7 +3,7 @@ package org.jcnc.jnotepad.ui.views.root.top.menubar.menu;
import javafx.scene.control.Menu; import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem; import javafx.scene.control.MenuItem;
import javafx.stage.Stage; import javafx.stage.Stage;
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu; import org.jcnc.jnotepad.api.core.views.menu.AbstractBaseMenu;
import org.jcnc.jnotepad.ui.component.stage.topmenu.help.DeveloperDebugPaneStage; import org.jcnc.jnotepad.ui.component.stage.topmenu.help.DeveloperDebugPaneStage;
import org.jcnc.jnotepad.ui.component.stage.topmenu.help.HelpPaneStage; import org.jcnc.jnotepad.ui.component.stage.topmenu.help.HelpPaneStage;
@ -17,7 +17,7 @@ import static org.jcnc.jnotepad.app.common.constants.TextConstants.*;
* *
* @author gewuyou * @author gewuyou
*/ */
public class HelpTopMenu extends AbstractTopMenu { public class HelpTopMenu extends AbstractBaseMenu {
private static final HelpTopMenu INSTANCE = new HelpTopMenu(); private static final HelpTopMenu INSTANCE = new HelpTopMenu();
@ -62,7 +62,7 @@ public class HelpTopMenu extends AbstractTopMenu {
* 注册顶部菜单 * 注册顶部菜单
*/ */
@Override @Override
protected void registerTopMenu() { protected void registerMenu() {
registerMenuItem(topMenuBar.getAboutItem(), ABOUT, "aboutItem", event -> new HelpPaneStage().run(new Stage())); registerMenuItem(topMenuBar.getAboutItem(), ABOUT, "aboutItem", event -> new HelpPaneStage().run(new Stage()));
registerMenuItem(topMenuBar.getDeveloperItem(), DEVELOPER, "developerItem", event -> new DeveloperDebugPaneStage().run()); registerMenuItem(topMenuBar.getDeveloperItem(), DEVELOPER, "developerItem", event -> new DeveloperDebugPaneStage().run());
} }

View File

@ -5,7 +5,7 @@ import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem; import javafx.scene.control.MenuItem;
import javafx.scene.control.RadioMenuItem; import javafx.scene.control.RadioMenuItem;
import javafx.scene.control.ToggleGroup; import javafx.scene.control.ToggleGroup;
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu; import org.jcnc.jnotepad.api.core.views.menu.AbstractBaseMenu;
import org.jcnc.jnotepad.app.i18n.UiResourceBundle; import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.controller.config.UserConfigController; import org.jcnc.jnotepad.controller.config.UserConfigController;
import org.jcnc.jnotepad.controller.i18n.LocalizationController; import org.jcnc.jnotepad.controller.i18n.LocalizationController;
@ -22,7 +22,7 @@ import static org.jcnc.jnotepad.app.common.constants.TextConstants.*;
* *
* @author gewuyou * @author gewuyou
*/ */
public class LanguageTopMenu extends AbstractTopMenu { public class LanguageTopMenu extends AbstractBaseMenu {
private static final LanguageTopMenu INSTANCE = new LanguageTopMenu(); private static final LanguageTopMenu INSTANCE = new LanguageTopMenu();
@ -69,14 +69,12 @@ public class LanguageTopMenu extends AbstractTopMenu {
*/ */
@Override @Override
public void initMenu() { public void initMenu() {
registerTopMenu(); registerMenu();
logger.info("初始化语言菜单!"); logger.info("初始化语言菜单!");
// 语言菜单 // 语言菜单
ToggleGroup languageToggleGroup = new ToggleGroup(); ToggleGroup languageToggleGroup = new ToggleGroup();
var itemMap = topMenuBar.getAllItemMap();
languageMenuItems.forEach((key, value) -> { languageMenuItems.forEach((key, value) -> {
UiResourceBundle.bindStringProperty(value.textProperty(), key); UiResourceBundle.bindStringProperty(value.textProperty(), key);
itemMap.put(key, value);
languageToggleGroup.getToggles().add(value); languageToggleGroup.getToggles().add(value);
topMenuBar.getLanguageMenu().getItems().add(value); topMenuBar.getLanguageMenu().getItems().add(value);
}); });
@ -91,7 +89,7 @@ public class LanguageTopMenu extends AbstractTopMenu {
* @apiNote 此方法 * @apiNote 此方法
*/ */
@Override @Override
protected void registerTopMenu() { protected void registerMenu() {
registerRadioMenuItem(languageMenuItems, topMenuBar.getChineseItem(), UPPER_CHINESE, Locale.CHINESE, this::toggleLanguage); registerRadioMenuItem(languageMenuItems, topMenuBar.getChineseItem(), UPPER_CHINESE, Locale.CHINESE, this::toggleLanguage);
registerRadioMenuItem(languageMenuItems, topMenuBar.getEnglishItem(), UPPER_ENGLISH, Locale.ENGLISH, this::toggleLanguage); registerRadioMenuItem(languageMenuItems, topMenuBar.getEnglishItem(), UPPER_ENGLISH, Locale.ENGLISH, this::toggleLanguage);
} }

View File

@ -2,7 +2,7 @@ package org.jcnc.jnotepad.ui.views.root.top.menubar.menu;
import javafx.scene.control.Menu; import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem; import javafx.scene.control.MenuItem;
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu; import org.jcnc.jnotepad.api.core.views.menu.AbstractBaseMenu;
import org.jcnc.jnotepad.ui.component.stage.topmenu.plugin.PluginManagementPane; import org.jcnc.jnotepad.ui.component.stage.topmenu.plugin.PluginManagementPane;
import java.util.HashMap; import java.util.HashMap;
@ -15,7 +15,7 @@ import static org.jcnc.jnotepad.app.common.constants.TextConstants.*;
* *
* @author gewuyou * @author gewuyou
*/ */
public class PluginTopMenu extends AbstractTopMenu { public class PluginTopMenu extends AbstractBaseMenu {
private static final PluginTopMenu INSTANCE = new PluginTopMenu(); private static final PluginTopMenu INSTANCE = new PluginTopMenu();
@ -60,7 +60,7 @@ public class PluginTopMenu extends AbstractTopMenu {
* 注册顶部菜单 * 注册顶部菜单
*/ */
@Override @Override
protected void registerTopMenu() { protected void registerMenu() {
registerMenuItem(topMenuBar.getPluginManagerItem(), MANAGER_PLUGIN, "pluginManagerItem", event -> new PluginManagementPane().run()); registerMenuItem(topMenuBar.getPluginManagerItem(), MANAGER_PLUGIN, "pluginManagerItem", event -> new PluginManagementPane().run());
registerMenuItem(topMenuBar.getCountItem(), STATISTICS, "countItem", event -> { registerMenuItem(topMenuBar.getCountItem(), STATISTICS, "countItem", event -> {
}); });

View File

@ -4,7 +4,7 @@ import javafx.event.ActionEvent;
import javafx.event.EventHandler; import javafx.event.EventHandler;
import javafx.scene.control.Menu; import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem; import javafx.scene.control.MenuItem;
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu; import org.jcnc.jnotepad.api.core.views.menu.AbstractBaseMenu;
import org.jcnc.jnotepad.app.utils.LogUtil; import org.jcnc.jnotepad.app.utils.LogUtil;
import org.jcnc.jnotepad.ui.component.module.vbox.BuildPanel; import org.jcnc.jnotepad.ui.component.module.vbox.BuildPanel;
import org.jcnc.jnotepad.ui.views.manager.BuildPanelManager; import org.jcnc.jnotepad.ui.views.manager.BuildPanelManager;
@ -23,7 +23,7 @@ import static org.jcnc.jnotepad.app.common.constants.TextConstants.RUN;
* *
* @author gewuyou * @author gewuyou
*/ */
public class RunTopMenu extends AbstractTopMenu { public class RunTopMenu extends AbstractBaseMenu {
private static final BuildPanelManager BUILD_PANEL_MANAGER = BuildPanelManager.getInstance(); private static final BuildPanelManager BUILD_PANEL_MANAGER = BuildPanelManager.getInstance();
private static final BuildPanel BUILD_PANEL = BuildPanel.getInstance(); private static final BuildPanel BUILD_PANEL = BuildPanel.getInstance();
private static final RunTopMenu INSTANCE = new RunTopMenu(); private static final RunTopMenu INSTANCE = new RunTopMenu();
@ -134,7 +134,7 @@ public class RunTopMenu extends AbstractTopMenu {
* 注册顶部菜单 * 注册顶部菜单
*/ */
@Override @Override
protected void registerTopMenu() { protected void registerMenu() {
// 运行 // 运行
registerMenuItem(topMenuBar.getRunItem(), RUN, "runItem", codeRun); registerMenuItem(topMenuBar.getRunItem(), RUN, "runItem", codeRun);

View File

@ -3,7 +3,7 @@ package org.jcnc.jnotepad.ui.views.root.top.menubar.menu;
import javafx.scene.control.Menu; import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem; import javafx.scene.control.MenuItem;
import javafx.stage.Stage; import javafx.stage.Stage;
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu; import org.jcnc.jnotepad.api.core.views.menu.AbstractBaseMenu;
import org.jcnc.jnotepad.app.utils.UiUtil; import org.jcnc.jnotepad.app.utils.UiUtil;
import org.jcnc.jnotepad.controller.config.UserConfigController; import org.jcnc.jnotepad.controller.config.UserConfigController;
import org.jcnc.jnotepad.controller.event.handler.menuitem.OpenConfig; import org.jcnc.jnotepad.controller.event.handler.menuitem.OpenConfig;
@ -19,7 +19,7 @@ import static org.jcnc.jnotepad.app.common.constants.TextConstants.*;
* *
* @author gewuyou * @author gewuyou
*/ */
public class SettingTopMenu extends AbstractTopMenu { public class SettingTopMenu extends AbstractBaseMenu {
private static final SettingTopMenu INSTANCE = new SettingTopMenu(); private static final SettingTopMenu INSTANCE = new SettingTopMenu();
private final Map<String, MenuItem> setMenuItems = new HashMap<>(); private final Map<String, MenuItem> setMenuItems = new HashMap<>();
@ -64,7 +64,7 @@ public class SettingTopMenu extends AbstractTopMenu {
* @apiNote 此方法 * @apiNote 此方法
*/ */
@Override @Override
protected void registerTopMenu() { protected void registerMenu() {
registerMenuItem(topMenuBar.getLineFeedItem(), WORD_WRAP, "lineFeedItem", (observableValue, before, after) -> { registerMenuItem(topMenuBar.getLineFeedItem(), WORD_WRAP, "lineFeedItem", (observableValue, before, after) -> {
// 1. 更新全局配置 // 1. 更新全局配置
UserConfigController.getInstance().setAutoLineConfig(after); UserConfigController.getInstance().setAutoLineConfig(after);

View File

@ -28,3 +28,20 @@ MANAGER_PLUGIN=管理插件
ENCODE=编码 ENCODE=编码
DE_BUG=调试 DE_BUG=调试
RUN=运行 RUN=运行
COPY=复制
FILE_NAME=文件名
FILE_PATH=文件路径
FOLDER_PATH=所在文件夹
EXPLORER=资源管理器
CLOSE=关闭
CLOSE_ALL_TABS=关闭所有标签页
CLOSE_LEFT_TABS=关闭左侧标签页
CLOSE_RIGHT_TABS=关闭右侧标签页
CLOSE_OTHER_TABS=关闭其他标签页
FIXED_TAB=固定标签页
UNFIXED_TAB=取消固定
READ_ONLY=只读
UNREAD_ONLY=取消只读
OPEN_ON=打开于