代码之家  ›  专栏  ›  技术社区  ›  guido

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

  •  1
  • guido  · 技术社区  · 12 年前

    我正在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数据库通信的模型类。

    这个组合框应该包含 小鬼 , 但也让空选择 ;它的值绑定到服务bean,如下所示:

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

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

    • 在做出选择后,我如何让用户改变主意,并在组合框中有一个空的选择?我应该将Imp的“假”空实例添加到由 ImpContentProvider(导入内容提供程序) ?或者我应该实现 ArrayContentProvider ?

    并且一个附加的相关问题是:

    • 为什么打电话 deselectAll() clearSelection() 在组合中没有为绑定的bean设置null值?
    2 回复  |  直到 8 年前
        1
  •  6
  •   Lii bob    8 年前

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

    使用转换器

    定义空的选择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;
    }
    
        2
  •  3
  •   Pefo    10 年前

    生成LabelProvider并处理null值

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

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

        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);
                }
            }
        });
    

    绑定组合查看器。。。