Java SWT、TreeViewer、带组合框的CellEditor

Java SWT、TreeViewer、带组合框的CellEditor,java,swt,jface,Java,Swt,Jface,在TreeViewer中对treeColumn使用EditingSupport时,是否有任何方法可以只反映视图中的更改,而不是更改模型,然后使用getViewer().update(元素,null) 详情: 我希望实现以下功能: 显示具有|对象|(组合框)属性的树视图| 选择并单击按钮后,我想向用户显示更改摘要,然后单击确认,我想将这些更改应用于模型(对象) 我使用的是TreeViewer,其中有一列启用了EditingSupport。 每当我从组合框中选择一个值并单击其他地方(lostFocu

在TreeViewer中对treeColumn使用EditingSupport时,是否有任何方法可以只反映视图中的更改,而不是更改模型,然后使用getViewer().update(元素,null)

详情: 我希望实现以下功能: 显示具有|对象|(组合框)属性的树视图| 选择并单击按钮后,我想向用户显示更改摘要,然后单击确认,我想将这些更改应用于模型(对象)

我使用的是TreeViewer,其中有一列启用了EditingSupport。 每当我从组合框中选择一个值并单击其他地方(lostFocus)时,该值就会设置为默认值。 我发现调用SetValue()后,会再次调用TreeLabelProvider(使用调试点) 是否有任何方法可以只反映视图中的更改,而不是更改模型并使用getViewer().update(element,null)

一些FYIs: 包对象包含多个版本

ContentProvider执行获取对象的作业

LabelProvider从包中获取所有版本(字符串[]),并显示第一个版本


//创建UI的代码 //废话


操作编辑支持类

private class OperationEditingSupport extends EditingSupport {
        private ComboBoxCellEditor cellEditor = null;

        private OperationEditingSupport(ColumnViewer viewer) {
            super(viewer);

            cellEditor = new ComboBoxCellEditor(
                    ((TreeViewer) viewer).getTree(), new String[] {},
                    SWT.READ_ONLY);

        }

        @Override
        protected CellEditor getCellEditor(Object element) {
            // TODO Auto-generated method stub

            if (element instanceof IPackageInfo) {
                IPackageInfo pkg = (IPackageInfo) element;
                cellEditor.setItems(PackageMgrUtil.getInstance().getVersions(
                        (IdmPackage) pkg, false, true));
                return cellEditor;
            }
            return null;
        }

        @Override
        protected boolean canEdit(Object element) {

            return true;
        }

        @Override
        protected Object getValue(Object element) {
            // TODO Auto-generated method stub

            return 0;
        }

        @Override
        protected void setValue(Object element, Object value) {

            /* only set new value if it differs from old one */

        }


    }
***************************************************
当我点击column2的单元格时,我得到了组合框,但当我选择某个内容并将焦点移动到其他地方时,它再次显示默认值

调试时,我发现: 它再次调用标签提供程序,它获取包的所有版本,然后显示第一个版本,因此我看不到任何更改

我想要的是,它应该在不改变底层对象的情况下保持选择的完整性

谢谢你的帮助。

找到了答案。 下面添加到SetValue()方法的代码解决了这个问题

m_tree = (Tree)getViewer.getControl();
TreeItem[] ti = m_tree.getSelection();
            CCombo c = ((CCombo)cellEditor.getControl());
            String str = c.getItem(c.getSelectionIndex());
            ti[0].setText(1, str );

请显示您拥有的代码,并准确指定不起作用的部分。树和模型应始终同步
m_tree = (Tree)getViewer.getControl();
TreeItem[] ti = m_tree.getSelection();
            CCombo c = ((CCombo)cellEditor.getControl());
            String str = c.getItem(c.getSelectionIndex());
            ti[0].setText(1, str );