欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TreeViewer使用小计 博客分类: java TreeViewertreeContentprovider

程序员文章站 2024-03-20 08:24:04
...

Jface.treeViewer使用小结

作为表格树

treeViewer 的使用和TableViewer的使用基本一样。如下:

treeViewer = new TreeViewer(this, SWT.FULL_SELECTION | SWT.BORDER);

        GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);

        treeViewer.getTree().setLayoutData(gridData);

 

        treeViewer.getTree().setHeaderVisible(true);

        treeViewer.getTree().setLinesVisible(true);

      

       // 创建列=====================

        UI.createTreeViewerColumn(treeViewer, "首列", 250);

        UI.createTreeViewerColumn(treeViewer, "第二列", 60);

        UI.createTreeViewerColumn(treeViewer, "第三列", 70);

        ……

        UI.createTreeViewerColumn(treeViewer, "备注", 80);

       // 创建列完毕===================

 

        C1PortTableProvider provider = new C1PortTableProvider();

        treeViewer.setContentProvider(provider);

        treeViewer.setLabelProvider(provider);

 

上面就创建了一个表格树的形式。其中第一列将以树形展示。

其中,

createTreeViewerColumn(TreeViewer viewer, String text, int width)

    {

        final TreeViewerColumn column = new TreeViewerColumn(viewer, SWT.LEFT);

        column.getColumn().setText(text == null ? "" : text);

        column.getColumn().setWidth(width);

        column.getColumn().setData(ID, text);

 

        return column;

}

LabelProvider

它的LabelProviderITableLabelProvider的实现。主要是实现:

public String getColumnText(Object element, int columnIndex);方法来填充界面显示的内容。

contentProvider

它的contentProviderITreeContentProvider的实现。ITreeContentProvider中的四个抽象方法都需要实现。

数据

为了满足或者说比较容易的实现ITreeContentProvider中的方法,需要设计一下这个treeViewer的数据来源,也就是treeViewer.setInput()时的参数。参照树的表现形式和ITreeContentProvider的四个方法。这个数据结构很容易的设计成:

protected String name;

protected EvaTreeItem parent;

protected List<EvaTreeItem> children;

private 其他属性(包括各列值)

public EvaTreeItem(String name, EvaTreeItem parent)

{

    super();

    this.name = name;

    this.parent = parent;

}

publicvoid addChild(EvaTreeItem child)

{

    if (null != child)

    {

        if (null == children)

        {

            children = new ArrayList<EvaTreeItem>();

        }

        children.add(child);

    }

}

……

这样在setInput()时,我们构造一个EvaTreeItem的集合(list等)作为参数,在实现ITreeContentProvider方法时,比较好写。如下:

@Override

    public Object[] getElements(Object inputElement)

    {

        if (inputElement instanceof List<?>)

        {

            return ((List<?>)inputElement).toArray();

        }

        returnnull;

    }

    @Override

    public Object[] getChildren(Object parentElement)

    {

        if (parentElement instanceof EvaTreeItem)

        {

            EvaTreeItem ccase = (EvaTreeItem)parentElement;

            if (null != ccase.getChildren() && !ccase.getChildren().isEmpty())

            {

                return ccase.getChildren().toArray();

            }

        }

        returnnull;

    }

 

    @Override

    public Object getParent(Object element)

    {

        if (element instanceof EvaTreeItem)

        {

            return ((EvaTreeItem)element).getParent();

        }

        returnnull;

    }

 

    @Override

    publicboolean hasChildren(Object parentElement)

    {

        if (parentElement instanceof EvaTreeItem)

        {

            EvaTreeItem ccase = (EvaTreeItem)parentElement;

            return (null != ccase.getChildren() && !ccase.getChildren().isEmpty());

        }

        returnfalse;

}

作为树使用

创建方式如同上述,但是要去掉创建列的部分。同时,可能需要去掉表格头和网线的显示。另外它的labelProvider不同(其他同,包括contentprovider和数据样式)

LabelProvider

它的labelprovider和上面的不同,不创建列时,它的labelprovider需要实现的是ILabelProvider.并实现其public String getText(Object element)方法。