如何处理JFace绑定组合框中的空选择?

gui*_*ido 1 java data-binding combobox jface eclipse-rcp

我正在我的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();
    }
});
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

一旦用户点击组合,就会产生一个选择(第一个元素):我可以看到对我在查看器上添加的selectionlistener的调用.我的问题是:

  • 选择完成后,如何让用户改变主意并在组合框中选择空白?我应该将"假"空的Imp实例添加到由ImpContentProvider?返回的列表中吗?或者我应该实施替代方案ArrayContentProvider

另外一个相关问题是:

  • 为什么调用deselectAll()clearSelection()组合不会为绑定bean设置空值?

sam*_*ddy 6

ComboViewer.setSelection(StructuredSelection.EMPTY)将触发选择事件并将"imp"设置为null.组合小部件选择事件仅在我认为从下拉列表中手动选择时触发.

使用转换器

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

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

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

public Object convert(Object fromObject)
{
    if(fromObject instanceof EMPTYEnum)
    {
        return null;
    }
    return fromObject;
}
Run Code Online (Sandbox Code Playgroud)