如何使用MagicDraw OpenAPI在主菜单栏Help按钮右侧添加TEST按钮?
在MagicDraw主菜单栏Help按钮右侧添加TEST按钮的解决方案
我正在使用MagicDraw OpenAPI,想要在MagicDraw主菜单栏的Help按钮右侧(见下图红圈位置)添加一个名为“TEST”的新按钮。
当前我写了一段代码,但运行后目标按钮并未显示:
public class Main extends Plugin{ public void init() { initialized = true; NMAction action = new MyAction("test", "TEST"); MainMenuConfiguration configurator = new MainMenuConfiguration((MyAction) action); ActionsConfiguratorsManager.getInstance().addMainMenuConfigurator(configurator); } } public class MainMenuConfiguration implements AMConfigurator { public void configure(ActionsManager actionsManager) { ActionsCategory newCategory = new ActionsCategory("idTest", "TEST"); ActionsManager newManager = new ActionsManager(); newManager.addCategory(newCategory); } }
问题分析
原代码存在几个关键问题:
- 新建了独立的
ActionsManager,没有关联到MagicDraw主菜单的实际管理器中 - 没有定位到Help菜单的位置,也没有将新的类别/Action插入到正确的位置
- 未实现
AMConfigurator的getPriority()方法,可能导致配置在默认菜单加载前执行,无法找到Help类别
修正后的代码
1. 插件主类
public class Main extends Plugin { @Override public void init() { initialized = true; // 创建自定义TEST按钮的Action NMAction testAction = new MyAction("test", "TEST"); // 注册主菜单配置器 ActionsConfiguratorsManager.getInstance().addMainMenuConfigurator(new MainMenuConfiguration(testAction)); } }
2. 自定义Action类(实现点击逻辑)
import javax.swing.*; import java.awt.event.ActionEvent; public class MyAction extends NMAction { public MyAction(String id, String name) { super(id, name, null, null); } @Override public void actionPerformed(ActionEvent e) { // 这里添加按钮点击后的业务逻辑,示例为弹窗提示 JOptionPane.showMessageDialog(null, "TEST按钮已触发!"); } }
3. 菜单配置类(核心逻辑)
import com.nomagic.actions.AMConfigurator; import com.nomagic.actions.ActionsCategory; import com.nomagic.actions.ActionsManager; import com.nomagic.actions.NMAction; import java.util.List; public class MainMenuConfiguration implements AMConfigurator { private final NMAction testAction; public MainMenuConfiguration(NMAction testAction) { this.testAction = testAction; } @Override public void configure(ActionsManager mainActionsManager) { // 获取主菜单中的Help类别 ActionsCategory helpCategory = mainActionsManager.getCategoryById("Help"); if (helpCategory == null) { return; } // 创建TEST类别并添加Action ActionsCategory testCategory = new ActionsCategory("idTest", "TEST"); testCategory.addAction(testAction); // 找到Help类别的位置,将TEST类别插入到它的右侧 List<ActionsCategory> categories = mainActionsManager.getCategories(); int helpIndex = categories.indexOf(helpCategory); if (helpIndex != -1) { mainActionsManager.addCategory(helpIndex + 1, testCategory); } } @Override public int getPriority() { // 设置优先级,确保在默认菜单配置完成后执行 return 100; } }
关键注意事项
- 优先级设置:必须实现
getPriority()方法,返回一个比默认配置更高的数值(比如100),确保我们的配置在MagicDraw默认菜单加载完成后执行,才能正确找到Help类别 - 关联主管理器:直接使用传入的
mainActionsManager操作主菜单,不要新建独立的ActionsManager - 位置插入:通过
indexOf找到Help类别的索引,插入到helpIndex + 1的位置,就能让TEST按钮出现在Help右侧 - Action逻辑:自定义Action必须实现
actionPerformed方法,否则按钮点击后无响应
内容的提问来源于stack exchange,提问作者xy3333
相关产品推荐
相关产品推荐

