SWT中Browser#setUrl获取焦点致右键菜单关闭的问题求助
解决Eclipse中右键列表触发Selection事件导致Browser关闭上下文菜单的问题
核心问题在于右键点击View1的列表时,SWT控件默认会触发Selection事件,进而执行View2的PDF更新逻辑,而Browser.setUrl()会让组件获取焦点,导致上下文菜单失去焦点关闭。以下是可行的解决方法:
方法一:在SelectionListener中区分右键触发的事件
通过判断SelectionEvent的button属性,识别右键点击行为,此时跳过View2的更新逻辑:
list.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { // 右键点击(button=3)时不执行PDF更新 if (e.button == 3) { return; } // 左键选中时正常更新View2的PDF String targetUrl = getSelectedItemUrl(); browser.setUrl(targetUrl); browser.update(); parent.layout(true); } });
方法二:通过MouseListener标记右键状态
如果部分控件的SelectionEvent.button属性无法正确获取,可先通过MouseListener记录右键点击状态,再在SelectionListener中判断:
private boolean isRightClick = false; // 给列表添加鼠标监听 list.addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { // 标记是否为右键点击 isRightClick = (e.button == 3); } }); // 处理选择事件 list.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (isRightClick) { isRightClick = false; // 重置标记 return; } // 执行PDF更新逻辑 String targetUrl = getSelectedItemUrl(); browser.setUrl(targetUrl); browser.update(); parent.layout(true); } });
方法三:结合上下文菜单的显示状态判断
如果上下文菜单是自定义的,可通过菜单的显示状态决定是否执行更新:
private boolean isMenuShowing = false; // 创建上下文菜单并添加监听 Menu contextMenu = new Menu(list); contextMenu.addMenuListener(new MenuAdapter() { @Override public void menuShown(MenuEvent e) { isMenuShowing = true; } @Override public void menuHidden(MenuEvent e) { isMenuShowing = false; } }); list.setMenu(contextMenu); // 处理选择事件 list.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (isMenuShowing) { return; } // 执行PDF更新逻辑 String targetUrl = getSelectedItemUrl(); browser.setUrl(targetUrl); browser.update(); parent.layout(true); } });
以上方法中,方法一是最直接高效的方案,优先推荐使用,它直接拦截右键触发的Selection事件,避免不必要的PDF更新操作,从根源上解决上下文菜单被关闭的问题。
内容的提问来源于stack exchange,提问作者paul
相关产品推荐
相关产品推荐

