♻️ 重构代码 重构顶部菜单栏与侧边工具栏

This commit is contained in:
gewuyou 2023-09-23 16:16:18 +08:00
parent 3ab4c4f77e
commit d2565799ef
11 changed files with 519 additions and 275 deletions

View File

@ -24,7 +24,7 @@ module org.jcnc.jnotepad {
exports org.jcnc.jnotepad.controller.config;
exports org.jcnc.jnotepad.controller.manager;
exports org.jcnc.jnotepad.controller.i18n;
exports org.jcnc.jnotepad.controller.event.handler.util;
exports org.jcnc.jnotepad.controller.event.handler.setting;
exports org.jcnc.jnotepad.controller.event.handler.menubar;
exports org.jcnc.jnotepad.util;
exports org.jcnc.jnotepad.common.interfaces;

View File

@ -15,7 +15,9 @@ import org.jcnc.jnotepad.controller.config.PluginConfigController;
import org.jcnc.jnotepad.controller.manager.Controller;
import org.jcnc.jnotepad.plugin.PluginManager;
import org.jcnc.jnotepad.util.UiUtil;
import org.jcnc.jnotepad.views.manager.ViewManager;
import org.jcnc.jnotepad.views.manager.RootManager;
import org.jcnc.jnotepad.views.manager.SidebarToolBarManager;
import org.jcnc.jnotepad.views.manager.TopMenuBarManager;
import java.util.List;
import java.util.Objects;
@ -60,6 +62,10 @@ public class ApplicationManager {
initScene();
// 初始化插件
PluginManager.getInstance().initializePlugins();
// 初始化顶部菜单栏
TopMenuBarManager.getInstance().initTopMenuBar();
// 初始化侧边工具栏
SidebarToolBarManager.getInstance().initSidebarToolBar();
// 初始化ui组件
initUiComponents();
// 初始化primaryStage
@ -147,8 +153,8 @@ public class ApplicationManager {
*/
public void initUiComponents() {
// 加载组件
ViewManager viewManager = ViewManager.getInstance(scene);
viewManager.initScreen(scene);
RootManager rootManager = RootManager.getInstance(scene);
rootManager.initScreen(scene);
}
public Pane getRoot() {

View File

@ -22,7 +22,6 @@ import java.util.List;
* @author 许轲
*/
public class NewFile implements EventHandler<ActionEvent> {
/**
* 处理新建文件事件
*

View File

@ -10,9 +10,9 @@ import org.jcnc.jnotepad.controller.i18n.LocalizationController;
import org.jcnc.jnotepad.ui.dialog.factory.impl.BasicFileChooserFactory;
import org.jcnc.jnotepad.util.LogUtil;
import org.jcnc.jnotepad.util.UiUtil;
import org.jcnc.jnotepad.views.manager.TopMenuBarManager;
import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTab;
import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTabPane;
import org.jcnc.jnotepad.views.root.top.menu.TopMenuBar;
import org.slf4j.Logger;
import java.io.File;
@ -56,7 +56,7 @@ public class SaveFile implements EventHandler<ActionEvent> {
if (CONFIG_NAME.equals(selectedTab.getText())) {
// 重新加载语言包和快捷键
AppConfigController.getInstance().loadConfig();
TopMenuBar.getInstance().initShortcutKeys();
TopMenuBarManager.getInstance().initShortcutKeys();
LocalizationController.initLocal();
logger.info("已刷新语言包!");
logger.info("已刷新快捷键!");

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad.controller.event.handler.util;
package org.jcnc.jnotepad.controller.event.handler.setting;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;

View File

@ -8,15 +8,15 @@ import org.jcnc.jnotepad.views.root.RootBorderPane;
import static org.jcnc.jnotepad.views.root.bottom.RootBottomSideBarVerticalBox.initSidebarVerticalBox;
/**
* 视图管理器类用于管理记事本应用程序的视图组件
* 根布局管理器类用于管理记事本应用程序的根布局组件
*
* <p>该类负责管理应用程序的视图组件包括主界面布局和标签页索引等</p>
* <p>该类负责管理应用程序的视图组件包括主界面布局</p>
*
* @author 许轲
*/
public class ViewManager {
public class RootManager {
private static ViewManager instance = null;
private static RootManager instance = null;
/**
* 主布局
@ -28,35 +28,35 @@ public class ViewManager {
*
* @param scene 与视图相关联的 JavaFX 场景
*/
private ViewManager(Scene scene) {
private RootManager(Scene scene) {
root = new BorderPane();
scene.setRoot(root);
}
/**
* 获取 ViewManager 的实例如果实例不存在则创建一个新实例
* 获取 RootManager 的实例如果实例不存在则创建一个新实例
*
* @param scene 与视图相关联的 JavaFX 场景
* @return ViewManager 的实例
* @return RootManager 的实例
*/
public static ViewManager getInstance(Scene scene) {
public static RootManager getInstance(Scene scene) {
if (instance == null) {
instance = new ViewManager(scene);
instance = new RootManager(scene);
}
return instance;
}
/**
* 获取 ViewManager 的实例
* 获取 RootManager 的实例
*
* @return ViewManager 的实例
* @return RootManager 的实例
* @throws AppException 如果实例未初始化
*/
public static ViewManager getInstance() {
public static RootManager getInstance() {
if (instance != null) {
return instance;
} else {
throw new AppException("ViewManager 的实例未初始化!");
throw new AppException("RootManager 的实例未初始化!");
}
}
@ -67,10 +67,8 @@ public class ViewManager {
* @param scene 与视图相关联的 JavaFX 场景
*/
public void initScreen(Scene scene) {
// 创建主界面布局
root = new BorderPane();
/*root.setTop(CustomTitleBar.getInstance());*/
root.setCenter(RootBorderPane.getInstance());
scene.setRoot(root);

View File

@ -0,0 +1,51 @@
package org.jcnc.jnotepad.views.manager;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import org.jcnc.jnotepad.controller.event.handler.setting.SetBtn;
import org.jcnc.jnotepad.views.root.left.sidebar.tools.SidebarToolBar;
import java.util.ArrayList;
import java.util.List;
/**
* 侧边工具栏管理类
*
* @author gewuyou
*/
public class SidebarToolBarManager {
private static final SidebarToolBarManager INSTANCE = new SidebarToolBarManager();
/**
* 工具栏
*/
SidebarToolBar sidebarToolBar = SidebarToolBar.getInstance();
List<Button> buttonList = new ArrayList<>();
public static SidebarToolBarManager getInstance() {
return INSTANCE;
}
public void initSidebarToolBar() {
registerSidebarToolBar();
initButtons();
}
private void initButtons() {
// 将按钮添加到工具栏
sidebarToolBar.getItems().addAll(buttonList);
}
public void registerSidebarToolBar() {
registerButton(sidebarToolBar.getSetButton(), new SetBtn());
}
public void registerButton(Button button, EventHandler<ActionEvent> eventHandler) {
buttonList.add(button);
setButton(button, eventHandler);
}
private void setButton(Button button, EventHandler<ActionEvent> eventHandler) {
button.setOnAction(eventHandler);
}
}

View File

@ -0,0 +1,353 @@
package org.jcnc.jnotepad.views.manager;
import javafx.beans.value.ChangeListener;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.control.*;
import javafx.scene.input.KeyCombination;
import javafx.stage.Stage;
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.controller.config.AppConfigController;
import org.jcnc.jnotepad.controller.event.handler.menubar.*;
import org.jcnc.jnotepad.controller.i18n.LocalizationController;
import org.jcnc.jnotepad.model.entity.ShortcutKey;
import org.jcnc.jnotepad.plugin.PluginManagerInterface;
import org.jcnc.jnotepad.util.LogUtil;
import org.jcnc.jnotepad.util.UiUtil;
import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTabPane;
import org.jcnc.jnotepad.views.root.top.menu.TopMenuBar;
import org.slf4j.Logger;
import java.util.*;
import static org.jcnc.jnotepad.common.constants.TextConstants.*;
/**
* 顶部菜单栏管理类
*
* @author gewuyou
*/
public class TopMenuBarManager {
private static final TopMenuBarManager INSTANCE = new TopMenuBarManager();
private final TopMenuBar topMenuBar = TopMenuBar.getInstance();
private final List<Menu> topMenu = new ArrayList<>();
private final Map<String, MenuItem> fileMenuItems = new HashMap<>();
private final Map<String, MenuItem> setMenuItems = new HashMap<>();
private final Map<String, MenuItem> pluginMenuItems = new HashMap<>();
private final Map<String, RadioMenuItem> languageMenuItems = new HashMap<>();
Logger logger = LogUtil.getLogger(this.getClass());
AppConfigController appConfigController = AppConfigController.getInstance();
private TopMenuBarManager() {
}
public static TopMenuBarManager getInstance() {
return INSTANCE;
}
/**
* 初始化菜单栏
*/
public void initTopMenuBar() {
topMenuBar.setPadding(new Insets(-3, 0, -3, 0));
registerTopMenuBar();
// 初始化文件菜单
initFileMenu();
// 初始化语言菜单
initLanguageMenu();
// 设置当前语言选中状态
toggleLanguageCheck(appConfigController.getLanguage());
// 初始化设置菜单
initSettingMenu();
// 初始化插件菜单
initPluginMenu();
// 刷新顶部菜单栏
refreshTopMenuBar();
// 初始化快捷键
initShortcutKeys();
}
/**
* 注册顶部菜单栏
*/
public void registerTopMenuBar() {
// 文件菜单
registerFileMenuItem(topMenuBar.getNewItem(), NEW, "newItem", new NewFile());
registerFileMenuItem(topMenuBar.getOpenItem(), OPEN, "openItem", new OpenFile());
registerFileMenuItem(topMenuBar.getSaveItem(), SAVE, "saveItem", new SaveFile());
registerFileMenuItem(topMenuBar.getSaveAsItem(), SAVE_AS, "saveAsItem", new SaveAsFile());
registerFileMenuItem(topMenuBar.getRenameItem(), RENAME, "renameItem", new RenameFile());
// 语言菜单
registerLanguageMenuItem(topMenuBar.getChineseItem(), UPPER_CHINESE, Locale.CHINESE, this::toggleLanguage);
registerLanguageMenuItem(topMenuBar.getEnglishItem(), UPPER_ENGLISH, Locale.ENGLISH, this::toggleLanguage);
// 设置菜单
registerSetMenuItem(topMenuBar.getLineFeedItem(), WORD_WRAP, "lineFeedItem", (observableValue, before, after) -> {
// 1. 更新全局配置
AppConfigController.getInstance().setAutoLineConfig(after);
// 2. 对当前tab生效配置
CenterTabPane.getInstance().fireTabSelected();
});
topMenuBar.getLineFeedItem().selectedProperty().set(true);
registerSetMenuItem(topMenuBar.getTopItem(), TOP, "topItem", (observableValue, before, after) -> {
// 获取窗口容器
Stage primaryStage = (Stage) UiUtil.getAppWindow();
// 设置窗口为置顶
primaryStage.setAlwaysOnTop(after);
});
registerSetMenuItem(topMenuBar.getOpenConfigItem(), OPEN_CONFIGURATION_FILE, "openConfigItem", new OpenConfig());
registerSetMenuItem(topMenuBar.getLanguageMenu(), LANGUAGE, "languageMenu", actionEvent -> {
});
//插件菜单
registerPluginMenuItem(topMenuBar.getAddItem(), ADD_PLUGIN, "addItem", event -> {
PluginManagerInterface pluginManagerInterface = PluginManagerInterface.getInstance();
Stage stage = new Stage();
stage.getIcons().add(UiUtil.getAppIcon());
pluginManagerInterface.start(stage);
});
registerPluginMenuItem(topMenuBar.getCountItem(), STATISTICS, "countItem", event -> {
});
}
/**
* 切换语言
*
* @param actionEvent 点击事件
*/
private void toggleLanguage(ActionEvent actionEvent) {
if (actionEvent == null) {
return;
}
RadioMenuItem languageItem = (RadioMenuItem) actionEvent.getSource();
if (languageItem == null) {
return;
}
LocalizationController.setCurrentLocal((Locale) languageItem.getUserData());
}
/**
* 设置当前语言选中状态
*
* @param language 语言
*/
public void toggleLanguageCheck(String language) {
languageMenuItems.forEach((k, v) -> v.setSelected(language.toUpperCase().equals(k)));
}
/**
* 注册文件菜单项
*
* @param menuItem 菜单项
* @param menuItemName 菜单项名称
* @param buttonName 按钮名称
* @param eventHandler 操作事件
*/
public void registerFileMenuItem(MenuItem menuItem, String menuItemName, String buttonName, EventHandler<ActionEvent> eventHandler) {
fileMenuItems.put(menuItemName, menuItem);
setMenuItem(menuItem, buttonName, eventHandler);
}
/**
* 注册设置菜单项
*
* @param menuItem 菜单项
* @param menuItemName 菜单项名称
* @param buttonName 按钮名称
* @param eventHandler 操作事件
*/
public void registerSetMenuItem(MenuItem menuItem, String menuItemName, String buttonName, EventHandler<ActionEvent> eventHandler) {
setMenuItems.put(menuItemName, menuItem);
setMenuItem(menuItem, buttonName, eventHandler);
}
/**
* 注册设置菜单项
*
* @param checkMenuItem 检查菜单项
* @param menuItemName 菜单项名称
* @param buttonName 按钮名称
* @param listener 监听事件
*/
public void registerSetMenuItem(CheckMenuItem checkMenuItem, String menuItemName, String buttonName, ChangeListener<Boolean> listener) {
setMenuItems.put(menuItemName, checkMenuItem);
setCheckMenuItem(checkMenuItem, buttonName, listener);
}
/**
* 注册语言菜单
*
* @param radioMenuItem 单选菜单项
* @param menuItemName 菜单项名称
* @param locale 语言
* @param eventHandler 操作事件
*/
public void registerLanguageMenuItem(RadioMenuItem radioMenuItem, String menuItemName, Locale locale, EventHandler<ActionEvent> eventHandler) {
languageMenuItems.put(menuItemName, radioMenuItem);
setRadioMenuItem(radioMenuItem, locale, eventHandler);
}
/**
* 注册插件菜单
*
* @param menuItem 菜单项
* @param menuItemName 菜单项名称
* @param buttonName 按钮名称
* @param eventHandler 操作事件
*/
public void registerPluginMenuItem(MenuItem menuItem, String menuItemName, String buttonName, EventHandler<ActionEvent> eventHandler) {
pluginMenuItems.put(menuItemName, menuItem);
setMenuItem(menuItem, buttonName, eventHandler);
}
/**
* 注册菜单项
*
* @param menuItem 菜单项
* @param buttonName 按钮名称
* @param eventHandler 操作事件
*/
private void setMenuItem(MenuItem menuItem, String buttonName, EventHandler<ActionEvent> eventHandler) {
menuItem.setUserData(buttonName);
menuItem.setOnAction(eventHandler);
}
/**
* 注册单选菜单项
*
* @param radioMenuItem 单选菜单项
* @param locale 语言
* @param eventHandler 操作事件
*/
private void setRadioMenuItem(RadioMenuItem radioMenuItem, Locale locale, EventHandler<ActionEvent> eventHandler) {
radioMenuItem.setUserData(locale);
radioMenuItem.setOnAction(eventHandler);
}
/**
* 注册检查菜单项
*
* @param checkMenuItem 检查菜单项
* @param buttonName 按钮名称
* @param listener 监听事件
*/
private void setCheckMenuItem(CheckMenuItem checkMenuItem, String buttonName, ChangeListener<Boolean> listener) {
checkMenuItem.setUserData(buttonName);
checkMenuItem.selectedProperty().addListener(listener);
}
/**
* 初始化快捷键
*/
public void initShortcutKeys() {
List<MenuItem> itemsToUnbind = new ArrayList<>();
List<ShortcutKey> shortcutKeyConfigs = appConfigController.getShortcutKey();
for (ShortcutKey shortcutKey : shortcutKeyConfigs) {
// 保证json的key必须和变量名一致
MenuItem menuItem = topMenuBar.getItemMap().get(shortcutKey.getButtonName());
String shortKeyValue = shortcutKey.getShortcutKeyValue();
if (Objects.isNull(menuItem) || "".equals(shortKeyValue)) {
itemsToUnbind.add(menuItem);
continue;
}
logger.info("功能名称:{}->快捷键:{}", menuItem.getText(), shortKeyValue);
// 动态添加快捷键
menuItem.setAccelerator(KeyCombination.keyCombination(shortKeyValue));
}
// 解绑需要解绑的快捷键
itemsToUnbind.forEach(menuItem -> menuItem.setAccelerator(null));
}
/**
* 初始化顶部菜单
*/
private void refreshTopMenuBar() {
ObservableList<Menu> menus = topMenuBar.getMenus();
menus.clear();
menus.addAll(topMenu);
}
/**
* 初始化插件菜单
*/
private void initPluginMenu() {
logger.info("初始化插件菜单!");
var pluginMenu = topMenuBar.getPluginMenu();
// 插件菜单
UiResourceBundle.bindStringProperty(pluginMenu.textProperty(), PLUGIN);
initMenuItems(pluginMenuItems, pluginMenu);
}
/**
* 初始化设置菜单
*/
private void initSettingMenu() {
logger.info("初始化设置菜单!");
var setMenu = topMenuBar.getSetMenu();
// 设置菜单
UiResourceBundle.bindStringProperty(setMenu.textProperty(), SET);
// 初始化菜单项
initMenuItems(setMenuItems, setMenu);
}
/**
* 初始化语言菜单
*/
private void initLanguageMenu() {
logger.info("初始化语言菜单!");
// 语言菜单
ToggleGroup languageToggleGroup = new ToggleGroup();
var itemMap = topMenuBar.getItemMap();
languageMenuItems.forEach((key, value) -> {
UiResourceBundle.bindStringProperty(value.textProperty(), key);
itemMap.put(key, value);
languageToggleGroup.getToggles().add(value);
topMenuBar.getLanguageMenu().getItems().add(value);
});
}
/**
* 初始化文件菜单
*/
private void initFileMenu() {
logger.info("初始化文件菜单!");
Menu fileMenu = topMenuBar.getFileMenu();
// 文件菜单
UiResourceBundle.bindStringProperty(fileMenu.textProperty(), FILE);
// 初始化菜单项
initMenuItems(fileMenuItems, fileMenu);
}
/**
* 初始化菜单项
*
* @param menuItems 菜单项集合
* @param menu 菜单
*/
private void initMenuItems(Map<String, MenuItem> menuItems, Menu menu) {
var itemMap = topMenuBar.getItemMap();
menuItems.forEach((key, value) -> {
UiResourceBundle.bindStringProperty(value.textProperty(), key);
itemMap.put((String) value.getUserData(), value);
menu.getItems().add(value);
});
topMenu.add(menu);
}
}

View File

@ -71,6 +71,9 @@ public class CenterTabPane extends TabPane {
*/
public void fireTabSelected() {
CenterTab selectedTab = getSelected();
if (selectedTab == null) {
return;
}
selectedTab.setAutoLine(AppConfigController.getInstance().getAutoLineConfig());
BottomStatusBox.getInstance().updateWhenTabSelected();
}

View File

@ -42,9 +42,6 @@ public class SidebarToolBar extends javafx.scene.control.ToolBar {
setButton.setGraphic(imageView);
setButton.setPrefWidth(imageView.getFitWidth() + 20);
setButton.setPrefHeight(imageView.getFitHeight() + 20);
// 将按钮添加到工具栏
getItems().addAll(setButton);
}
/**

View File

@ -1,27 +1,11 @@
package org.jcnc.jnotepad.views.root.top.menu;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.scene.control.*;
import javafx.scene.input.KeyCombination;
import javafx.stage.Stage;
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.controller.config.AppConfigController;
import org.jcnc.jnotepad.controller.event.handler.menubar.*;
import org.jcnc.jnotepad.controller.event.handler.util.SetBtn;
import org.jcnc.jnotepad.controller.i18n.LocalizationController;
import org.jcnc.jnotepad.model.entity.ShortcutKey;
import org.jcnc.jnotepad.plugin.PluginManagerInterface;
import org.jcnc.jnotepad.util.LogUtil;
import org.jcnc.jnotepad.util.UiUtil;
import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTab;
import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTabPane;
import org.jcnc.jnotepad.views.root.left.sidebar.tools.SidebarToolBar;
import org.slf4j.Logger;
import java.util.*;
import static org.jcnc.jnotepad.common.constants.TextConstants.*;
import java.util.HashMap;
import java.util.Map;
/**
* 封装菜单栏组件
@ -39,295 +23,80 @@ public class TopMenuBar extends MenuBar {
* 标签页布局组件封装
*/
CenterTabPane centerTabPane = CenterTabPane.getInstance();
AppConfigController appConfigController = AppConfigController.getInstance();
Logger logger = LogUtil.getLogger(this.getClass());
/**
* 工具栏
*/
SidebarToolBar sidebarToolBar = SidebarToolBar.getInstance();
/**
* 获取工具栏中的setButton
*/
Button setButton = sidebarToolBar.getSetButton();
/**
* 文件菜单
*/
private Menu fileMenu;
private final Menu fileMenu = new Menu();
/**
* 设置菜单
*/
private Menu setMenu;
private final Menu setMenu = new Menu();
/// 菜单按钮
/**
* 插件菜单
*/
private Menu pluginMenu;
private final Menu pluginMenu = new Menu();
/**
* 语言菜单
*/
private Menu languageMenu;
private final Menu languageMenu = new Menu();
/**
* 新建
*/
private MenuItem newItem;
private final MenuItem newItem = new MenuItem();
/**
* 打开
*/
private MenuItem openItem;
private final MenuItem openItem = new MenuItem();
/**
* 另存为
*/
private MenuItem saveAsItem;
private final MenuItem saveAsItem = new MenuItem();
/**
* 保存
*/
private MenuItem saveItem;
private final MenuItem saveItem = new MenuItem();
/**
* 重命名
*/
private MenuItem renameItem;
private final MenuItem renameItem = new MenuItem();
/**
* 增加
*/
private MenuItem addItem;
private final MenuItem addItem = new MenuItem();
/**
* 查看
*/
private MenuItem countItem;
private final MenuItem countItem = new MenuItem();
/**
* 打开配置文件
*/
private MenuItem openConfigItem;
private final MenuItem openConfigItem = new MenuItem();
/**
* 自动换行点击菜单按钮
*/
private CheckMenuItem lineFeedItem;
private final CheckMenuItem lineFeedItem = new CheckMenuItem();
/**
* 置顶按钮
*/
private CheckMenuItem topItem;
private final CheckMenuItem topItem = new CheckMenuItem();
/**
* 中文选项
*/
private RadioMenuItem chineseItem;
private final RadioMenuItem chineseItem = new RadioMenuItem();
/**
* 英文选项
*/
private RadioMenuItem englishItem;
private final RadioMenuItem englishItem = new RadioMenuItem();
private TopMenuBar() {
initMenuBar();
}
public static TopMenuBar getInstance() {
return MENU_BAR;
}
/**
* 设置当前语言选中状态
*
* @param language 语言
*/
public void toggleLanguageCheck(String language) {
switch (language) {
case CHINESE -> chineseItem.setSelected(true);
case ENGLISH -> englishItem.setSelected(true);
default -> logger.error("未知语言:{}", language);
}
}
/**
* 初始化菜单栏
*/
public void initMenuBar() {
setPadding(new Insets(-3,0,-3,0));
initFileMenu();
initLanguageMenu();
initSettingMenu();
initPluginMenu();
this.getMenus().clear();
// 菜单栏
this.getMenus().addAll(fileMenu, setMenu, pluginMenu);
initEventHandlers();
initShortcutKeys();
toggleLanguageCheck(appConfigController.getLanguage());
}
/**
* 初始化快捷键
*/
public void initShortcutKeys() {
List<ShortcutKey> shortcutKeyConfigs = appConfigController.getShortcutKey();
//FIXME: 如果shortcutKey不存在需要解绑已绑定的快捷键
for (ShortcutKey shortcutKey : shortcutKeyConfigs) {
// 保证json的key必须和变量名一致
MenuItem menuItem = this.itemMap.get(shortcutKey.getButtonName());
String shortKeyValue = shortcutKey.getShortcutKeyValue();
if (Objects.isNull(menuItem) || "".equals(shortKeyValue)) {
continue;
}
logger.info("功能名称:{}->快捷键:{}", menuItem.getText(), shortKeyValue);
// 动态添加快捷键
menuItem.setAccelerator(KeyCombination.keyCombination(shortKeyValue));
}
}
/**
* 初始化语言菜单
*/
private void initLanguageMenu() {
logger.info("初始化语言菜单!");
// 语言菜单
languageMenu = new Menu();
UiResourceBundle.bindStringProperty(languageMenu.textProperty(), LANGUAGE);
ToggleGroup languageToggleGroup = new ToggleGroup();
chineseItem = new RadioMenuItem();
UiResourceBundle.bindStringProperty(chineseItem.textProperty(), UPPER_CHINESE);
chineseItem.setUserData(Locale.CHINESE);
itemMap.put("chineseItem", chineseItem);
languageToggleGroup.getToggles().add(chineseItem);
englishItem = new RadioMenuItem();
UiResourceBundle.bindStringProperty(englishItem.textProperty(), UPPER_ENGLISH);
englishItem.setUserData(Locale.ENGLISH);
itemMap.put("englishItem", englishItem);
languageToggleGroup.getToggles().add(englishItem);
languageMenu.getItems().addAll(chineseItem, englishItem);
}
/**
* 初始化文件菜单
*/
private void initFileMenu() {
logger.info("初始化文件菜单!");
// 文件菜单
fileMenu = new Menu();
UiResourceBundle.bindStringProperty(fileMenu.textProperty(), FILE);
newItem = new MenuItem();
UiResourceBundle.bindStringProperty(newItem.textProperty(), NEW);
itemMap.put("newItem", newItem);
openItem = new MenuItem();
UiResourceBundle.bindStringProperty(openItem.textProperty(), OPEN);
itemMap.put("openItem", openItem);
saveItem = new MenuItem();
UiResourceBundle.bindStringProperty(saveItem.textProperty(), SAVE);
itemMap.put("saveItem", saveItem);
saveAsItem = new MenuItem();
UiResourceBundle.bindStringProperty(saveAsItem.textProperty(), SAVE_AS);
itemMap.put("saveAsItem", saveAsItem);
renameItem = new MenuItem();
UiResourceBundle.bindStringProperty(renameItem.textProperty(), RENAME);
itemMap.put("renameItem", renameItem);
fileMenu.getItems().addAll(newItem, openItem, saveItem, saveAsItem, renameItem);
}
/**
* 初始化设置菜单
*/
private void initSettingMenu() {
logger.info("初始化设置菜单");
// 设置菜单
setMenu = new Menu();
UiResourceBundle.bindStringProperty(setMenu.textProperty(), SET);
lineFeedItem = new CheckMenuItem();
UiResourceBundle.bindStringProperty(lineFeedItem.textProperty(), WORD_WRAP);
itemMap.put("lineFeedItem", lineFeedItem);
lineFeedItem.selectedProperty().set(true);
topItem = new CheckMenuItem();
UiResourceBundle.bindStringProperty(topItem.textProperty(), TOP);
itemMap.put("topItem", topItem);
openConfigItem = new MenuItem();
UiResourceBundle.bindStringProperty(openConfigItem.textProperty(), OPEN_CONFIGURATION_FILE);
itemMap.put("openConfigItem", openConfigItem);
itemMap.put("languageMenu", languageMenu);
setMenu.getItems().addAll(lineFeedItem, openConfigItem, topItem, languageMenu);
}
/**
* 初始化插件菜单
*/
private void initPluginMenu() {
logger.info("初始化插件菜单!");
// 插件菜单
pluginMenu = new Menu();
UiResourceBundle.bindStringProperty(pluginMenu.textProperty(), PLUGIN);
addItem = new MenuItem();
addItem.setOnAction(event -> {
PluginManagerInterface pluginManagerInterface = PluginManagerInterface.getInstance();
Stage stage = new Stage();
stage.getIcons().add(UiUtil.getAppIcon());
pluginManagerInterface.start(stage);
});
UiResourceBundle.bindStringProperty(addItem.textProperty(), ADD_PLUGIN);
itemMap.put("addItem", addItem);
countItem = new MenuItem();
UiResourceBundle.bindStringProperty(countItem.textProperty(), STATISTICS);
itemMap.put("countItem", countItem);
pluginMenu.getItems().addAll(addItem, countItem);
}
/**
* 初始化事件处理
*/
private void initEventHandlers() {
newItem.setOnAction(new NewFile());
openItem.setOnAction(new OpenFile());
saveItem.setOnAction(new SaveFile());
saveAsItem.setOnAction(new SaveAsFile());
openConfigItem.setOnAction(new OpenConfig());
renameItem.setOnAction(new RenameFile());
setButton.setOnAction(new SetBtn());
lineFeedItem.selectedProperty().addListener((observableValue, before, after) -> {
// 1. 更新全局配置
AppConfigController.getInstance().setAutoLineConfig(after);
// 2. 对当前tab生效配置
centerTabPane.fireTabSelected();
});
topItem.selectedProperty().addListener((observableValue, before, after) -> {
// 获取窗口容器
Stage primaryStage = (Stage) this.getScene().getWindow();
// 设置窗口为置顶
primaryStage.setAlwaysOnTop(after);
});
englishItem.setOnAction(this::toggleLanguage);
chineseItem.setOnAction(this::toggleLanguage);
}
/**
* 切换语言
*
* @param actionEvent 点击事件
*/
private void toggleLanguage(ActionEvent actionEvent) {
if (actionEvent == null) {
return;
}
RadioMenuItem languageItem = (RadioMenuItem) actionEvent.getSource();
if (languageItem == null) {
return;
}
LocalizationController.setCurrentLocal((Locale) languageItem.getUserData());
}
/**
* 根据当前选中tab更新菜单选项
@ -336,4 +105,72 @@ public class TopMenuBar extends MenuBar {
CenterTab selectedTab = centerTabPane.getSelected();
lineFeedItem.selectedProperty().setValue(selectedTab.isAutoLine());
}
public Menu getFileMenu() {
return fileMenu;
}
public Menu getSetMenu() {
return setMenu;
}
public Menu getPluginMenu() {
return pluginMenu;
}
public Menu getLanguageMenu() {
return languageMenu;
}
public Map<String, MenuItem> getItemMap() {
return itemMap;
}
public MenuItem getNewItem() {
return newItem;
}
public MenuItem getOpenItem() {
return openItem;
}
public MenuItem getSaveAsItem() {
return saveAsItem;
}
public MenuItem getSaveItem() {
return saveItem;
}
public MenuItem getRenameItem() {
return renameItem;
}
public MenuItem getAddItem() {
return addItem;
}
public MenuItem getCountItem() {
return countItem;
}
public MenuItem getOpenConfigItem() {
return openConfigItem;
}
public CheckMenuItem getLineFeedItem() {
return lineFeedItem;
}
public CheckMenuItem getTopItem() {
return topItem;
}
public RadioMenuItem getChineseItem() {
return chineseItem;
}
public RadioMenuItem getEnglishItem() {
return englishItem;
}
}