`

TreeView 使用属性监听;保护以前TreeTable的功能

 
阅读更多

TreeView 使用属性监听感觉比Table复杂一些,写了一个仿照书上的例子:

 

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;

import book.ch7.tree.UserStructure;

public class UsingTreeViewer {

    private static Shell sShell = null;
    private Tree tree = null;

    private void createSShell() {
        sShell = new Shell();
        sShell.setText("Shell");
        sShell.setSize(new Point(300, 200));
        sShell.setLayout(new FillLayout());
        tree = new Tree(sShell, SWT.NONE);
        tree.setHeaderVisible(true);
        tree.setLinesVisible(true);
        TreeColumn treeColumn = new TreeColumn(tree, SWT.NONE);
        treeColumn.setWidth(60);
        treeColumn.setText("ID");
        TreeColumn treeColumn1 = new TreeColumn(tree, SWT.NONE);
        treeColumn1.setWidth(60);
        treeColumn1.setText("Name");

        TreeViewer treeViewer = new TreeViewer(tree);
        treeViewer.setContentProvider(new MyUserTreeContentProvider());
        treeViewer.setLabelProvider(new MyTableLabelProvider());

        MyUser president = new MyUser("0", "President");
        MyUser manager1 = new MyUser("1", "Manager 1");
        MyUser manager2 = new MyUser("2", "Manager 2");
        president.addChildren(manager1);
        president.addChildren(manager2);

        MyUser student = new MyUser("2", "Manager 2");
        manager1.addChildren(student);
        manager1.addChildren(new MyUser("4", "student 2"));
        manager2.addChildren(new MyUser("5", "student 3"));
        manager2.addChildren(new MyUser("6", "student 4"));

        student.addChildren(new MyUser("6", "student 4"));

        TreeData data = new TreeData(president);
        treeViewer.setInput(data);

        data.add(president, new MyUser("3", "Manager 3"));
        data.add(student, new MyUser("3", "Manager 3"));

        data.remove(manager2);
        data.remove(manager1);
    }

    public static void main(String[] args) {
        Display display = Display.getDefault();
        new UsingTreeViewer().createSShell();

        sShell.open();
        sShell.layout();

        while (!sShell.isDisposed())
            if (!display.readAndDispatch())
                display.sleep();
    }

}

class MyTableLabelProvider implements ITableLabelProvider {
    public Image getColumnImage(Object element, int columnIndex) { return null; }
    public String getColumnText(Object element, int columnIndex) {
        if (element instanceof MyUser) {
            MyUser user = (MyUser) element;
            switch (columnIndex) {
                case 0:
                    return user.id;
                case 1:
                    return user.name;
            }
        }
        return null;
    }
    public void dispose() {}
    public boolean isLabelProperty(Object element, String property) { return false; }
    public void addListener(ILabelProviderListener listener) {}
    public void removeListener(ILabelProviderListener listener) {}
}

class MyUserTreeContentProvider implements ITreeContentProvider,
PropertyChangeListener {

    public Object[] getChildren(Object parentElement) {
        return ((MyUser) parentElement).children.toArray();
    }

    public Object getParent(Object element) {
        return ((MyUser) element).parent;
    }

    public boolean hasChildren(Object element) {
        Vector<MyUser> children = ((MyUser) element).children;
        return children.size() != 0;
    }

    public Object[] getElements(Object inputElement) {
        if (inputElement instanceof TreeData) {
            return ((TreeData) inputElement).getList().toArray();
        }
        return new Object[0];
    }

    private TreeViewer viewer;

    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        this.viewer = (TreeViewer) viewer;
        if (oldInput != null)
            ((TreeData) oldInput).removePropertyChangeListener(this);
        if (newInput != null)
            ((TreeData) newInput).addPropertyChangeListener(this);
    }

    public void propertyChange(PropertyChangeEvent evt) {
        if (UserStructure.ADD_USER.equals(evt.getPropertyName())) {
            Object[] values = (Object[])evt.getNewValue();
            viewer.add(values[0], values[1]);
        }
        if (UserStructure.REMOVE_USER.equals(evt.getPropertyName())) {
            viewer.remove(evt.getNewValue());
        }
    }

    public void dispose() {}
}

class TreeData {

    public static final String ADD_USER = "addUser";

    public static final String REMOVE_USER = "removeUser";

    List<MyUser> list = new ArrayList<MyUser>();

    public TreeData(MyUser president) {
        list.add(president);
        delegate = new PropertyChangeSupport(this);
    }

    public List<MyUser> getList() {
        return list;
    }

    public void add(MyUser parent, MyUser newUser) {
        if (parent != null && ! parent.children.contains(newUser)) {
            parent.addChildren(newUser);
            firePropertyChange(new PropertyChangeEvent(this, ADD_USER,
                    null, new Object[] {parent, newUser }));
        }
    }
    public void remove(MyUser theUser) {
        if (theUser != null
                && theUser.parent.children.remove(theUser)) {
            theUser.parent = null ;
            firePropertyChange(new PropertyChangeEvent(this, REMOVE_USER, null,
                    theUser));
        }
    }

    private PropertyChangeSupport delegate;

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        delegate.addPropertyChangeListener(listener);
    }

    public void firePropertyChange(PropertyChangeEvent evt) {
        delegate.firePropertyChange(evt);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        delegate.removePropertyChangeListener(listener);
    }
}

class MyUser {
    String id;
    String name;
    MyUser parent;
    Vector<MyUser> children = new Vector<MyUser>();

    public MyUser(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public void addChildren(MyUser child) {
        children.add(child);
        child.parent = this;
    }

}

 

分享到:
评论

相关推荐

    comobox和treeview所有属性和方法

    本文将深入探讨这两种控件的主要属性和方法,帮助初学者更好地理解和使用它们。 **ComboBox** 是一个组合了文本输入框和下拉列表的控件,通常用于提供一组预定义选项供用户选择。它的主要属性和方法包括: 1. **...

    C# 实例treeTable.zip

    - 在Windows Forms应用中,通常使用`System.Windows.Forms.TreeView`控件和`System.Windows.Forms.DataGridView`控件组合来实现TreeTable效果,或者使用第三方库如DevExpress、Telerik等提供的高级控件。...

    treeview添加删除修改上移下移功能

    在IT行业中,`TreeView`控件是常见的图形用户界面元素,尤其在Windows应用程序开发中广泛使用,如.NET Framework的WinForms或WPF等框架。它主要用于显示层次化的数据结构,通常表现为树状视图,用户可以展开、折叠...

    TreeTable,用于展开/折叠table的行

    在实际应用中,开发TreeTable可以使用各种编程语言和框架,如JavaScript中的jQuery TreeTable插件,Java中的Swing或JavaFX TreeTableView,.NET Framework中的WPF TreeView结合DataGrid,或者在Web开发中使用React、...

    Android-TreeView具有高性能和丰富功能的Android树形视图

    然后,你需要创建一个`TreeView`对象,并设置必要的属性,如根节点、展开策略等。接着,你可以创建自定义的`TreeAdapter`来处理数据,并将其绑定到`TreeView`上。节点的数据通常以`TreeNode`对象的形式存在,你可以...

    Bootstrap treeview实现动态加载数据并添加快捷搜索功能

    在本文中,我们将使用 Bootstrap Treeview 实现动态加载数据,并添加快捷搜索功能,以实现快速查询省市区的区域名称信息。 数据表结构 数据源为省市区地域信息表,该表为自关联结构。本文将使用该表中的数据来动态...

    Asp.net Treeview 控件常用属性.

    8. **自定义节点旁的图标**:通过`ExpandedImageUrl`、`ImageUrl`、`SelectedImageUrl`这三个属性,可以根据节点的不同状态选择合适的图标,从而提升界面的美观度和功能性。 以上详细介绍了`TreeView`控件的常用...

    VS之treeview使用

    本篇文章将深入探讨"VS之treeview使用"的相关知识点。 一、TreeView控件简介 TreeView控件是一个可视化的控件,它可以显示一个层次结构的节点,每个节点可以包含子节点。每个节点称为TreeNode,可以包含文本、图像...

    TreeView控件使用技巧

    在PowerBuilder中,使用TreeView控件的一般步骤包括: 1. 创建应用程序并建立与数据库的接口,这是进行数据操作的基础。 2. 在应用窗口中添加DataWindow控件(如dw_3和dw_4)和TreeView控件(如TV_1)。 3. 修改DW_...

    Winform自定义绘制TreeView及实现多选功能

    本文将深入探讨如何自定义绘制`TreeView`并实现多选功能,同时介绍如何修改`TreeNode`的样式,添加背景板,改变字体,并在节点后添加按钮。 首先,`TreeView`控件的默认行为不支持多选。为了实现多选功能,我们需要...

    qt qml treeview 树控件

    本文将深入探讨如何利用Qt QML实现一个功能丰富的树形控件,包括递归显示、节点展开与折叠、选中效果、点击事件以及使用tag属性来传递额外数据。 首先,我们要导入必要的QML模块,特别是`QtQuick.Controls`模块,它...

    C# treeview使用源码

    首先,创建一个新的`TreeNode`对象,设置其文本属性(即节点显示的文本),然后使用`TreeView`的`Nodes`集合的`Add`方法将其添加到树中。例如: ```csharp TreeNode newNode = new TreeNode("新节点"); treeView1...

    treeview的使用

    下面将详细解释TreeView的使用及其相关知识点。 1. TreeView控件简介: TreeView控件是Windows Forms和.NET Framework中的一种控件,用于展示具有层级结构的数据。每个节点(TreeNode)可以代表一个数据项,并且...

    WPF下的TreeTable实现示例

    在Windows Presentation Foundation(WPF)中,TreeTable是一种结合了TreeView和DataGrid功能的控件,它将数据以树状结构展示,并且每个节点可以展开显示详细的数据表格。这种控件在处理层次结构数据时非常有用,...

    TreeView的CheckBoxs的第三种状态(有部分子结点被选中)

    默认情况下,`TreeView`控件并不直接支持复选框功能,但可以通过自定义绘图或者使用特定的API来实现这一功能。 在.NET Framework或者WPF等开发环境中,我们可以利用`TreeNode`的`Checked`属性来管理复选框的状态。...

    treeview和listview结合使用的例子

    `TreeView`和`ListView`是Windows Forms开发中的强大工具,结合使用可以构建出功能丰富的界面。通过事件监听和数据绑定,可以轻松实现类似资源管理器的功能,提供用户友好的交互体验。理解并熟练掌握这两种控件的...

    treeview的使用小结

    下面我们将深入探讨`TreeView`的使用及其相关知识点。 1. **基本概念**:`TreeView`控件由一个或多个`TreeNode`对象组成,每个`TreeNode`代表树结构中的一个节点,可以包含子节点(即嵌套的`TreeNode`)。根节点...

    TreeView控件的使用

    TreeView控件的节点绑定可以通过使用TreeNode对象和TreeView控件的Nodes属性来实现。在上面的代码中,我们使用了foreach循环来遍历DataSet中的数据,并创建相应的TreeNode对象,然后将其添加到TreeView控件上。 ...

    treeview控件的使用

    TreeView控件是一种在Windows应用程序中广泛使用的用户界面组件,它以层次化列表的形式展示项目,每个项目可以有若干子项目。这种控件特别适用于需要以树状结构展示数据的场景,如文件系统、组织结构等。 创建...

    QML树控件TreeView的使用

    在Qt5.5之前是没有树控件的,我们在使用时用的是ListView来构造出一个树,Qt5.5之后的QML开发阶段,有了树控件TreeView,本篇着重记录QML的TreeView的使用(包括增加树节点和删除节点)。

Global site tag (gtag.js) - Google Analytics