You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 19:47:32