【问题标题】:SWT TreeViewer with combobox and checkbox带有组合框和复选框的 SWT TreeViewer
【发布时间】:2015-12-01 02:41:36
【问题描述】:

我正在寻找一种在表格/网格的第一列中显示树的方法,其中包含其他三个列,一个带有组合框,另一个带有复选框。我一直在尝试使用 TreeViewer 来完成这项工作,但它不太适合我正在寻找的东西。这棵树很好地融合在一起。我使用 EditorSupport 的 Combobox 列,并在 getCellEditor 方法中返回一个 ComboboxCellEditor 但是当您选择该列中的一个单元格时,您只能看到该列中有一个组合框。然后,当您单击单元格外时,所选值将恢复为默认空白。复选框列也是如此,它仅在选中单元格时可见。我正在寻找可以显示组合框列和复选框列始终可见的树的东西。我查看了 TableViewer,但找不到在第一列中强制插入树的方法。我看过 Nebula Grid,但它看起来并不支持组合框。关于如何让其中一个像我正在寻找的那样工作的任何提示,或者我应该查看其他一些树/表/网格。谢谢。

编辑:这是 EditingSupport 类的代码。

private class ComboBoxEditingSupport extends EditingSupport
{
    private ComboBoxCellEditor cellEditor;

    public ComboBoxEditingSupport(ColumnViewer viewer)
    {
        super(viewer);

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

    }

    @Override
    protected CellEditor getCellEditor(Object element)
    {
        if (element instanceof MyObject
        {
            return cellEditor;
        }
        return null;
    }

    @Override
    protected boolean canEdit(Object element)
    {
        if (element instanceof MyObject
        {
            return true;
        }
        return false;
    }

    @Override
    protected Object getValue(Object element)
    {
        return 0;
    }

    @Override
    protected void setValue(Object element, Object value)
    {
        TreeItem[] ti = treeViewer.getTree().getSelection();
        CCombo combo = ((CCombo) cellEditor.getControl());
        String str = combo.getItem(combo.getSelectionIndex());
        ti[0].setText(1, str);
    }
}

【问题讨论】:

  • 我已经厌倦了 swt TreeViewer 和 TreeColumnViewers 的列。我试过星云网格。这是关闭,但从外观上看,它不支持列中的组合框。我已经尝试过 TableViewer,但它不支持我需要的树。
  • EditingSupport 与 ComboboxCellEditor 应该可以工作,听起来你在 setValue 方法中有问题 - 向我们展示你的代码。

标签: java user-interface swt tableviewer treeviewer


【解决方案1】:

您的setValue 方法必须更新模型数据中的值(内容提供者返回的数据)。 setValueelement 参数是您应该更新的特定模型数据对象 (MyObject)。

更新值调用后:

getViewer().update(element, null);

从模型中获取树以更新显示。

尝试直接更新TreeItem 是行不通的。

【讨论】:

  • 这帮了大忙,让我们走上了正确的道路。我想一个后续问题是如何让组合框始终显示向下箭头。现在它只在单击单元格后显示,一旦单元格失去焦点就会消失。
  • 复选框列也是如此。我如何让复选框实际显示出来。我有它的功能,但没有显示一个复选框。
  • 不幸的是,EditingSupport 代码一次只支持一个单元格,如您所见。您可能必须使用OwnerDrawLabelProvider 并自己绘制所有单元格才能做得更好。
猜你喜欢
  • 2013-12-02
  • 2013-06-15
  • 2014-12-25
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多