【问题标题】:Why does my Menu Listener not respond to first click?为什么我的菜单监听器不响应第一次点击?
【发布时间】:2021-08-10 07:24:47
【问题描述】:

所以我有一个表项的菜单,我尝试为它添加一个 MenuListener。调试时,第一次单击表时,仅创建侦听器并且不处理事件。在第二次单击时,它的行为应如此。 我有以下代码:

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

我的自定义 ChangeMenu 类看起来像这样

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

        }
}

因此,在第一次单击表时,会创建更改菜单,但不会以某种方式调用 showMenu。只有第二次点击我才能看到那里声明的菜单项。

【问题讨论】:

  • 你在哪里打电话addMenuForTable
  • 我有一个自定义 View 类,在 createWidgetry 方法中我用我的表项调用 addMenuForTable。
  • 在这里测试可以正常工作,所以问题可能出在你没有向我们展示的东西上
  • @greg-449 我在调用 addMenuForTable 的地方添加了我的 createWidgetry 方法

标签: java eclipse swt


【解决方案1】:

在菜单检测监听器中添加菜单为时已晚,此处无需使用此监听器。只需在创建表后立即添加菜单:

addMenuForTable(this.tables[i].getTableViewer().getTable());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2011-03-03
    相关资源
    最近更新 更多