1

我正在我的 eclipse-rcp 应用程序中开发一个搜索对话框。

在搜索对话框中,我有一个组合框,如下所示:

comboImp = new CCombo(grpColSpet, SWT.BORDER | SWT.READ_ONLY);
comboImp.setBounds(556, 46, 184, 27);
comboImpViewer = new ComboViewer(comboImp);
comboImpViewer.setContentProvider(new ArrayContentProvider());
comboImpViewer.setInput(ImpContentProvider.getInstance().getImps());
comboImpViewer.setLabelProvider(new LabelProvider() {
    @Override
    public String getText(Object element) {
        return ((Imp)element).getImpName();
    }
});

Imp是一个数据库实体,ManyToOne 是被搜索的主要实体,是ImpContentProvider通过 jpa/hibernate 与嵌入式 sqlite 数据库对话的模型类。

这个组合框应该包含 的所有实例Imp但也允许空选择;它的值绑定到一个服务 bean,如下所示:

IObservableValue comboImpSelectionObserveWidget = 
    ViewersObservables.observeSingleSelection(comboImpViewer);
IObservableValue filterByImpObserveValue = 
    BeansObservables.observeValue(searchPrep, "imp");
bindingContext.bindValue(comboImpSelectionObserveWidget, filterByImpObserveValue
    , null, null);

一旦用户单击组合,就会进行选择(第一个元素):我可以看到对我在查看器上添加的选择侦听器的调用。我的问题是:

  • 做出选择后,如何让用户改变主意并在组合框中有一个空选择?我应该将 Imp 的“假”空实例添加到返回的列表中ImpContentProvider吗?还是我应该实施替代方案ArrayContentProvider

还有一个相关的问题是:

  • 为什么在组合上调用deselectAll()andclearSelection()不会为绑定的 bean 设置空值?
4

2 回答 2

6

ComboViewer.setSelection(StructuredSelection.EMPTY)将触发选择事件并将“imp”设置为空。我认为只有在从下拉列表中手动选择时才会触发组合小部件选择事件。

使用转换器

定义空选择 obj,让我们说 EMPTYEnum(在标签提供程序中显示空字符串)

您可以定义UpdateValueStrategy目标到模型并IConverter在绑定可观察对象时进行设置。在转换器中,您可以将 EMPTYEnum 转换为 null。

IConverter:
fromType: Object.class
toType: Object.class

public Object convert(Object fromObject)
{
    if(fromObject instanceof EMPTYEnum)
    {
        return null;
    }
    return fromObject;
}
于 2012-09-27T03:35:02.877 回答
3

制作 LabelProvider 并处理空值

public String getText(Object element) {
    if (element == null) { 
        return "Choose one"; 
    }
    return super.getText(element);
}

在索引 0 处插入空值并处理空选择

    combo.setInput(yourItems);
    combo.insert(null, 0);
    combo.getCCombo().select(0);
    combo.addPostSelectionChangedListener(new ISelectionChangedListener() {
        @Override
        public void selectionChanged(SelectionChangedEvent event) {
            if (combo.getCCombo().getSelectionIndex() == -1) {
                combo.getCCombo().select(0);
            }
        }
    });

绑定 ComboViewer ...

于 2014-08-08T11:21:30.567 回答