SWT,TreeViewer,带ComboBox的CellEditor

时间:2014-11-16 13:13:56

标签: java swt jface

在TreeViewer中使用EditingSupport作为treeColumn时,有什么方法可以反映视图中的更改而不是更改模型然后使用getViewer()。update(element,null);

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

我正在使用TreeViewer,其中我有一个已启用EditingSupport的列。 每当我从ComboBox中选择一个值并单击其他地方(lostFocus类型)时,Value设置为默认值。 我已经发现在调用SetValue()之后再次调用TreeLabelProvider(使用调试点) 有什么方法可以反映视图中的更改而不是更改模型并使用getViewer()。update(element,null);

部分FYI: 包对象包含多个版本

ContentProvider完成了获取对象的工作

LabelProvider从包中获取所有版本(String [])并显示第一个版本。


//创建UI的代码 // blah

TreeViewerColumn column2 = new TreeViewerColumn(treeViewer, SWT.LEFT);
        column2.getColumn().setText("Version");
        column2.getColumn().setWidth(130);
        treeViewer.setLabelProvider(new PackageUpdateTreeLabelProvider());
        EditingSupport exampleEditingSupport = new OperationEditingSupport(
                column2.getViewer());
        column2.setEditingSupport(exampleEditingSupport);

OperationEditingSupport Class

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的单元格时,我得到了组合框,但是当我选择了某些内容并将焦点移动到其他位置时。它再次显示默认值

在调试时我发现: 它再次调用标签Provider,它获取包的所有版本,然后显示第一个,因此我看不到任何变化。

我想要的是它应该保持选择不变而不改变底层对象。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

想出来。 以下代码添加到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 );