【问题标题】:SWT , TreeViewer , CellEditor with ComboBoxSWT , TreeViewer , 带有 ComboBox 的 CellEditor
【发布时间】:2015-01-13 10:58:34
【问题描述】:

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

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

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

一些仅供参考: 包对象包含多个版本

ContentProvider 负责获取对象

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


//创建用户界面的代码 // 废话

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 类

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

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

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

感谢您的帮助。

【问题讨论】:

  • 请出示您拥有的代码,并准确说明哪些部分不起作用。
  • 树和模型应该始终同步

标签: java swt jface


【解决方案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 );

【讨论】:

    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2012-04-12
    相关资源
    最近更新 更多