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

JFace Dialog中无法获取ListViewer选中项问题咨询

排查JFace Dialog中okPressed()无法获取ListViewer选中项的问题

嘿,我之前碰到过类似的情况,咱们一步步拆解排查:

首先,先确认你在widgetSelected()和okPressed()里获取选中项的代码是不是完全一致?比如按钮点击事件里你可能写了:

IStructuredSelection selection = (IStructuredSelection) listViewer.getSelection();
Object selectedItem = selection.getFirstElement();

如果okPressed()里用了不同写法——比如错误转换Selection类型,或者引用了旧的ListViewer实例——那肯定拿不到值。先把两段代码对齐,确保逻辑完全一致。

接下来,检查有没有其他代码在okPressed触发前清空了选中状态?比如有没有在Dialog的close()方法、其他按钮事件里调用了listViewer.setSelection(StructuredSelection.EMPTY)?如果有的话,okPressed()执行时选中项已经被清掉,自然拿不到。

然后,验证ListViewer在okPressed()时是否还处于有效状态?可以加个简单判断:

@Override
protected void okPressed() {
    if (listViewer.getControl().isDisposed()) {
        // 控件已经被销毁,此时无法获取选中项
        System.out.println("ListViewer控件已提前销毁");
        super.okPressed();
        return;
    }
    // 正常获取选中项
    IStructuredSelection selection = (IStructuredSelection) listViewer.getSelection();
    Object selectedItem = selection.getFirstElement();
    // 后续业务逻辑
    super.okPressed();
}

如果打印了控件已销毁,那得找找是谁提前调用了dispose()——比如是不是在okPressed()之前手动关闭了对话框?

如果以上都没问题,那可以试试缓存选中项的方式绕开这个问题:在Dialog里加个成员变量存储选中项,给ListViewer加个选择监听器,每次选中变化时更新这个变量,最后在okPressed()里直接读取这个变量。比如:

private Object currentSelectedItem;

// 初始化ListViewer时添加选择监听器
private void initListViewer() {
    // ... 你的ListViewer初始化代码 ...
    listViewer.addSelectionChangedListener(new ISelectionChangedListener() {
        @Override
        public void selectionChanged(SelectionChangedEvent event) {
            IStructuredSelection selection = (IStructuredSelection) event.getSelection();
            currentSelectedItem = selection.getFirstElement();
        }
    });
}

@Override
protected void okPressed() {
    if (currentSelectedItem != null) {
        // 直接用缓存的选中项处理逻辑
    }
    super.okPressed();
}

这种方式相当于把选中状态同步到Dialog的成员变量里,不管ListViewer的状态怎么变化,都能拿到最后一次选中的内容。

最后,检查Windows Builder生成的代码有没有隐藏坑——比如有没有在createContents()之后又重新初始化了ListViewer?如果生成的代码不小心覆盖了你的ListViewer引用,那okPressed()里访问的可能是个空的或新的实例,自然拿不到选中项。

内容的提问来源于stack exchange,提问作者aviit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:41:32