为什么我的Menu Listener首次点击不会触发响应?
问题根因
SWT的菜单事件触发有固定顺序:当右键点击控件触发MenuDetectEvent时,系统会先校验该控件是否已经绑定了Menu对象,若未绑定则直接终止后续菜单显示流程,不会触发menuShown回调。
你当前的逻辑是在第一次MenuDetectEvent触发时才创建Menu并绑定给表格,已经错过了本次事件的菜单显示校验时机,因此首次点击只会完成监听器创建,不会弹出菜单;第二次点击时表格已经绑定了Menu,才能正常触发menuShown逻辑加载菜单项。
解决方案
将Menu的创建和绑定逻辑提前到表格初始化阶段,不要等右键点击时才创建,修改后的代码如下:
private void createWidgets(Composite composite) { // 原有创建标签页的逻辑保留 for (int i = 0; i < numberOfTabs; i++) { // 原有标签页填充表格的逻辑保留 Table table = this.tables[i].getTableViewer().getTable(); // 初始化阶段直接完成菜单绑定,不要放到点击监听里 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类中存在笔误:menuShown方法里的this.logChangeMenu.getItems()应改为this.someMenu.getItems(),否则运行时会抛出空指针异常。
如果确实需要在菜单弹出前执行自定义检测逻辑,可以把对应逻辑放到menuShown方法开头即可,不需要额外加MenuDetectListener。
内容的提问来源于stack exchange,提问作者Aliicide
相关产品推荐
相关产品推荐

