【问题标题】:Eclipse Main Menu (Top level) Show Action: MainMenuEventEclipse 主菜单(顶级)显示操作:MainMenuEvent
【发布时间】:2011-03-12 13:19:11
【问题描述】:

我在 Eclipse 论坛中搜索了 Google 和询问,但仍然对如何做这个简单的事情感到困惑: 我有 SWT 的例子:

public class MenuActionListenerShow {

public static void main(String[] args) { 显示显示 = 新显示(); 外壳外壳 = 新外壳(显示);

Listener showListener = new Listener() {
  public void handleEvent(Event event) {
    Menu menu = (Menu) event.widget;
    MenuItem item = menu.getParentItem();
    if (item != null) {
      System.out.println(item.getText());

    }
  }
};

Menu menuBar = new Menu(shell, SWT.BAR);
shell.setMenuBar(menuBar);
MenuItem fileItem = new MenuItem(menuBar, SWT.CASCADE);
fileItem.setText("File");
MenuItem editItem = new MenuItem(menuBar, SWT.CASCADE);
editItem.setText("Edit");
Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
fileMenu.addListener(SWT.Show, showListener);
fileItem.setMenu(fileMenu);

shell.open();
while (!shell.isDisposed()) {
  if (!display.readAndDispatch())
    display.sleep();
}
display.dispose();

}

}

我希望在主菜单(例如文件/搜索/编辑)中做同样的事情。 我有一个插件,我的目的是当 File/Edit/Search.... (Menus) press/shown/cascaded 时,带有菜单名称的文本会显示在我的视图中。 是否可以或不允许获取 Eclipse 主菜单的 API 引用? 这对于一些提示会很棒。

谢谢

【问题讨论】:

    标签: eclipse events view menu eclipse-plugin


    【解决方案1】:

    你可以做到,尽管它并不像看起来那么容易。 eclipse中的主菜单是非常动态的。例如,子菜单是惰性创建的,或者编辑器的切换可能会在顶部带来新菜单。您必须确保始终注册/取消注册您的听众。

    如果您创建一个视图,您可以使用给定的父组合来获取主菜单并注册您的侦听器。但正如我所说,您必须确保始终注册/取消注册侦听器,否则您会遇到内存泄漏、多个注册的侦听器...

    这里是注册的示例视图。它不会跟踪新项目/消失的项目(将此作为家庭作业;))。

    public class ViewPart1 extends ViewPart {
        @Override
        public void createPartControl(Composite parent) {
            Shell shell = parent.getParent().getShell();
            Menu menu = shell.getMenuBar();
            addListeners(menu);
        }
    
        private void addListeners(Menu menu) {
            menu.addListener(SWT.Show, showListener);
            for (MenuItem item : menu.getItems()) {
                Menu subMenu = item.getMenu();
                if (subMenu != null) {
                    addListeners(subMenu);
                }
            }
        }
    
        Listener showListener = new Listener() {
            public void handleEvent(Event event) {
                Menu menu = (Menu) event.widget;
                MenuItem item = menu.getParentItem();
                if (item != null) {
                    System.out.println(item.getText());
                }
            }
        };
    
        @Override
        public void setFocus() {
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多