我在eclipse论坛上搜索了Google And Asked,但仍然混淆了如何做到这一点: 我得到了SWT的例子:
public class MenuActionListenerShow {
public static void main(String [] args){ 显示display = new Display(); Shell shell = new Shell(显示);
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();
}
}
我希望对主菜单做同样的事情(例如文件/搜索/编辑)。 我有插件,我的目的是在文件/编辑/搜索....(菜单)按下/显示/级联时,我的视图中显示菜单名称的文本。 是否可以或不允许获取Eclipse主菜单的API引用? 一些提示会很棒。
感谢
答案 0 :(得分: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() {
}
}