为什么我的菜单监听器不响应第一次点击?

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());