为什么我的菜单监听器不响应第一次点击?
Why does my Menu Listener not respond to first click?
所以我有一个 table 项目的菜单,我尝试为其添加一个 MenuListener。调试时,第一次单击 table 时,只会创建侦听器,不会处理事件。在第二次单击时,它会正常运行。
我有以下代码:
private void createWidgets(Composite composite)
{
//some tabs are created
for (int i = 0; i < numberOfTabs; i++)
{
//tabs are populated with tables
this.tables[i].getTableViewer().getTable().addMenuDetectListener(new MenuDetectListener() {
@Override
public void menuDetected(MenuDetectEvent e) {
Table table = (Table) e.getSource();
addMenuForTable(table);
}
});
}
this.tabFolder.setSelection(0);
}
private void addMenuForTable(Table table)
{
final Menu someMenu = new Menu(table);
table.setMenu(someMenu);
someMenu.addMenuListener(new ChangingMenu(this, table, someMenu));
}
我的自定义 ChangingMenu class 看起来像这样
public class ChangingMenu extends MenuAdapter {
private Menu someMenu;
private SomeView view;
private Table table;
public ChangingMenu(SomeView view, Table viewer, Menu someMenu) {
this.view = view;
this.someMenu= someMenu;
this.table = viewer;
}
@Override
public void menuShown(MenuEvent e) {
MenuItem[] menuItems = this.logChangeMenu.getItems();
for (int i = 0; i < menuItems.length; i++) {
menuItems[i].dispose();
}
addMenu(this.table);
}
private void addMenu(Table table) {
MenuItem menuItem= new MenuItem(this.someMenu, SWT.NONE);
menuItem.setText("Some text here");
//here I have a listener for this menu item that opens some dialog on item click
}
}
因此,在第一次单击 table 时,会创建更改菜单,但不会以某种方式调用 showMenu。只有在第二次点击时,我才能看到那里声明的菜单项。
在menu detect listener中添加菜单已经太晚了,这里没有必要使用这个listener。只需在创建 table 后立即添加菜单:
addMenuForTable(this.tables[i].getTableViewer().getTable());
所以我有一个 table 项目的菜单,我尝试为其添加一个 MenuListener。调试时,第一次单击 table 时,只会创建侦听器,不会处理事件。在第二次单击时,它会正常运行。 我有以下代码:
private void createWidgets(Composite composite)
{
//some tabs are created
for (int i = 0; i < numberOfTabs; i++)
{
//tabs are populated with tables
this.tables[i].getTableViewer().getTable().addMenuDetectListener(new MenuDetectListener() {
@Override
public void menuDetected(MenuDetectEvent e) {
Table table = (Table) e.getSource();
addMenuForTable(table);
}
});
}
this.tabFolder.setSelection(0);
}
private void addMenuForTable(Table table)
{
final Menu someMenu = new Menu(table);
table.setMenu(someMenu);
someMenu.addMenuListener(new ChangingMenu(this, table, someMenu));
}
我的自定义 ChangingMenu class 看起来像这样
public class ChangingMenu extends MenuAdapter {
private Menu someMenu;
private SomeView view;
private Table table;
public ChangingMenu(SomeView view, Table viewer, Menu someMenu) {
this.view = view;
this.someMenu= someMenu;
this.table = viewer;
}
@Override
public void menuShown(MenuEvent e) {
MenuItem[] menuItems = this.logChangeMenu.getItems();
for (int i = 0; i < menuItems.length; i++) {
menuItems[i].dispose();
}
addMenu(this.table);
}
private void addMenu(Table table) {
MenuItem menuItem= new MenuItem(this.someMenu, SWT.NONE);
menuItem.setText("Some text here");
//here I have a listener for this menu item that opens some dialog on item click
}
}
因此,在第一次单击 table 时,会创建更改菜单,但不会以某种方式调用 showMenu。只有在第二次点击时,我才能看到那里声明的菜单项。
在menu detect listener中添加菜单已经太晚了,这里没有必要使用这个listener。只需在创建 table 后立即添加菜单:
addMenuForTable(this.tables[i].getTableViewer().getTable());