NetBeans模块自定义动作如何添加至标准菜单Window/IDE Tools下
NetBeans模块自定义动作如何添加至标准菜单Window/IDE Tools下
我太懂你踩的这个坑了!之前我也犯过一模一样的错——直接把Menu/Window/IDE Tools全路径塞给@ActionReference的path属性,结果凭空多出个重复的IDE Tools菜单,完全不是想要的效果。
问题根源在这儿:直接写全路径会让NetBeans误以为你要创建一个全新的菜单层级,而不是挂载到它本身已经注册好的那个IDE Tools子菜单上。咱们得换个写法,用@ActionReference的menuID参数来关联已有的子菜单,而不是硬拼路径。
具体改法超简单,只需要修改你代码里的@ActionReference注解就行:
原来的代码行:
@ActionReference(path = "Menu/Window", position = 5000)
替换成:
@ActionReference(path = "Menu/Window", menuID = "IDE-Tools", position = 5000)
给你拆解下这几个参数的作用:
path = "Menu/Window":指定动作的父菜单是顶级的Window菜单menuID = "IDE-Tools":这是核心!这个值对应NetBeans内部已经注册好的IDE Tools子菜单的ID,用它就能把动作挂载到已有的那个菜单里,不会新建重复项position = 5000:控制你这个动作在IDE Tools子菜单里的排序位置,5000这个值会把它放在所有默认动作的后面,位置很合理
修改后的完整代码如下:
@ActionID( category = "Window", id = "ste.netbeans.nblogmanager.logviewer.LogViewerShortcutAction" ) @ActionRegistration( displayName = "#CTL_LogViewerShortcutAction", key = "DS-L" // Ctrl+Shift+L ) @ActionReference(path = "Menu/Window", menuID = "IDE-Tools", position = 5000) @Messages({ "CTL_LogViewerShortcutAction=Show Log Viewer" }) public final class LogViewerShortcutAction extends AbstractAction { public LogViewerShortcutAction() { putValue(NAME, Bundle.CTL_LogViewerShortcutAction()); } @Override public void actionPerformed(ActionEvent e) { TopComponent tc = WindowManager.getDefault().findTopComponent("LogViewerTopComponent"); if (tc == null) { tc = new LogViewerTopComponent(); } tc.open(); tc.requestActive(); } }
最后记得重新构建你的NetBeans模块,重启IDE之后,你的Show Log Viewer动作就会乖乖出现在Window>IDE Tools菜单下面,不会再冒出重复的菜单了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

