From cf453a012cf127bd24c893462284d8cd12fcf532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E8=BD=B2?= Date: Wed, 11 Oct 2023 02:08:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20AbstractMenuBuilder.java?= =?UTF-8?q?=20=E7=9A=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/stage/AbstractMenuBuilder.java | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 src/main/java/org/jcnc/jnotepad/api/core/component/stage/AbstractMenuBuilder.java diff --git a/src/main/java/org/jcnc/jnotepad/api/core/component/stage/AbstractMenuBuilder.java b/src/main/java/org/jcnc/jnotepad/api/core/component/stage/AbstractMenuBuilder.java new file mode 100644 index 0000000..6d6d8f5 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/api/core/component/stage/AbstractMenuBuilder.java @@ -0,0 +1,138 @@ +package org.jcnc.jnotepad.api.core.component.stage; + +import javafx.collections.ObservableList; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.control.*; + +/** + * 抽象菜单建造者类 + * + *

+ * 该抽象类用于构建菜单,包括菜单项、单选菜单项、复选菜单项、分割线等。 + * 子类应继承此类以实现具体的菜单构建逻辑。 + *

+ * + * @param 建造者类型 + * @param 构建结果类型 + * + * @author gewuyou + */ +public abstract class AbstractMenuBuilder { + /** + * 获取子类的建造者实例 + * + * @return 建造者实例 + */ + protected abstract B getBuilder(); + + /** + * 获取菜单的菜单项列表 + * + * @return 菜单项列表 + */ + protected abstract ObservableList getItems(); + + /** + * 添加菜单项 + * + * @param label 菜单项名称 + * @param eventHandler 事件处理器 + * @return 当前建造者实例 + */ + public B addMenuItem(String label, EventHandler eventHandler) { + MenuItem menuItem = new MenuItem(label); + menuItem.setOnAction(eventHandler); + getItems().add(menuItem); + return getBuilder(); + } + + /** + * 添加菜单项 + * + * @param label 菜单项名称 + * @param eventHandler 事件处理器 + * @param disable 是否禁用 + * @return 当前建造者实例 + */ + public B addMenuItem(String label, EventHandler eventHandler, boolean disable) { + if (!disable) { + return getBuilder(); + } + MenuItem menuItem = new MenuItem(label); + menuItem.setOnAction(eventHandler); + getItems().add(menuItem); + return getBuilder(); + } + + /** + * 添加单选菜单项 + * + * @param label 菜单项名称 + * @param eventHandler 事件处理器 + * @return 当前建造者实例 + */ + public B addRadioMenuItem(String label, EventHandler eventHandler) { + RadioMenuItem menuItem = new RadioMenuItem(label); + menuItem.setOnAction(eventHandler); + getItems().add(menuItem); + return getBuilder(); + } + + /** + * 添加复选菜单项 + * + * @param label 菜单项名称 + * @param eventHandler 事件处理器 + * @return 当前建造者实例 + */ + public B addCheckMenuItem(String label, EventHandler eventHandler) { + CheckMenuItem menuItem = new CheckMenuItem(label); + menuItem.setOnAction(eventHandler); + getItems().add(menuItem); + return getBuilder(); + } + + /** + * 添加菜单 + * + * @param menu 菜单 + * @return 当前建造者实例 + */ + public B addMenu(Menu menu) { + getItems().add(menu); + return getBuilder(); + } + + /** + * 添加菜单 + * + * @param menu 菜单 + * @param disable 是否禁用 + * @return 当前建造者实例 + */ + public B addMenu(Menu menu, boolean disable) { + if (!disable) { + return getBuilder(); + } + getItems().add(menu); + return getBuilder(); + } + + /** + * 添加分割线 + * + * @return 当前建造者实例 + */ + public B addSeparatorMenuItem() { + getItems().add(new SeparatorMenuItem()); + return getBuilder(); + } + + /** + * 构建菜单 + * + * @return 构建的菜单 + */ + public abstract T build(); +}