java - 禁用 Jface 菜单管理器(灰显)

标签 java eclipse-plugin jface

我有一个菜单管理器“menuManager”,它保存菜单项(操作)和一个子菜单,另一个菜单管理器“subMenu”包含更多操作。

final MenuManager subMenu = new MenuManager("Main",null);
subMenu.add(mActionClose);    

MenuManager menuManager = new MenuManager("#PopupMenu", "contextMenu");
menuManager.add(action1);
menuManager.add(action2);
menuManager.add(subMenu);

我只能在操作上设置 setEnabled(false),而不能在菜单管理器上设置。

最佳答案

重写 MenuManagerisEnabled() 方法没有任何影响。您可以做的是访问相关MenuItem并尝试禁用它。

首先,添加 IMenuListener到您的“上下文菜单”管理器以访问关联的 Menu :

public void menuAboutToShow(IMenuManager manager) {
    manager.getMenu().addListener(SWT.Show, showContextMenuListener);
}

在监听器中,您可以找到与您的子菜单管理器匹配的MenuItem:

public void handleEvent(Event event) {
    for (MenuItem item: ((Menu)event.widget).getItems())
        //MenuItem data should be our MenuManager
        if (item.getData().equals(subMenu)) {
            //Disable the sub-menu item
            item.setEnabled(false);
            //Add listener to sub-menu (see comments below the code block)
            item.getMenu().addListener(SWT.Show, showSubMenuListener);
        }
}

问题在于,MenuManager 类中有一个错误修复代码,一旦单击该子菜单项(如果它包含任何项目),该代码将重新启用子菜单项。要覆盖此设置,您还需要向子菜单添加 SWT.Show 监听器,以便在单击后菜单变得可见时更新子菜单项的启用:

public void handleEvent(Event event) {
    ((Menu)event.widget).getParentItem().setEnabled(false);
}

关于java - 禁用 Jface 菜单管理器(灰显),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8062578/

相关文章:

java - 以编程方式获取目标平台列表

java - 以 Composite 作为内容的 TreeViewer

java - 泛型返回类型方法中的不兼容类型 (Java)

java - SSLHandshakeException : Certificate Unknown (Java Spring Boot & Android)

java - iReport java堆空间

java - swt 或 jface 代码来创建文本编辑器和 Canvas

mysql - 如何使用 TableViewer Jface 创建带有值的动态列

java - 将 JavaRDD<Tuple2<Object, long[]>> 转换为 Java 中的 Spark Dataset<Row>

java - Eclipse 中的这些操作的启用和禁用选项如何工作?

eclipse-plugin - 将 jetty 输出打印到 Eclipse 控制台窗口