我正在我的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设置空值?答案 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 ...