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

时间:2012-09-27 02:17:04

标签: java data-binding combobox eclipse-rcp jface

我正在我的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);

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

  • 选择完成后,如何让用户改变主意并在组合框中选择空?我应该在ImpContentProvider返回的列表中添加一个“虚假”的Imp空实例吗?或者我应该实现ArrayContentProvider
  • 的替代方案

另外一个相关问题是:

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

2 个答案:

答案 0 :(得分:6)

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

使用转换器

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

您可以为target-to-model定义UpdateValueStrategy,并在绑定observable时设置IConverter。 在转换器中,您可以将EMPTYEnum转换为null。

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

public Object convert(Object fromObject)
{
    if(fromObject instanceof EMPTYEnum)
    {
        return null;
    }
    return fromObject;
}

答案 1 :(得分: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 ...