`

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;
    }

}

 

分享到:
评论

相关推荐

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

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

    bootstrapTable.treeview使用示例.rar

    这个压缩包中的文件,"bootstrapTable.treeview使用示例",可能是一个HTML文件,包含了一个已经配置好的表格,展示了如何使用JavaScript来启用 `treeview` 功能。通常,这样的示例会包括以下关键部分: 1. **HTML...

    treeTable测试样例

    开发者需要了解TreeTable提供的API,如添加、删除、移动节点,以及监听展开、折叠、点击等事件,以实现动态交互和业务逻辑。 7. **用户体验** 设计良好的TreeTable应该考虑用户体验,包括清晰的视觉指示(如折叠...

    bootstrap-treeview树节点实现动态加载(懒加载)

    3. **动态插入节点**:接收到服务器返回的数据后,使用Bootstrap Treeview提供的API,如`addNode`或`reload`方法,将新数据动态插入到现有树结构中。 4. **缓存管理**:为了提高性能,可以考虑缓存已加载的节点数据...

    TreeTableView

    4. **数据绑定**:使用JavaFX的数据绑定机制,将`TreeItem`的属性与列进行绑定,确保数据更新时视图自动同步。 5. **事件处理**:添加监听器来处理用户的交互事件,如点击、展开或折叠节点。 6. **样式和布局**:...

    bootstrap树形表格

    4. 可选地,根据需要添加自定义事件监听器和扩展功能。 通过以上步骤,你可以在你的Web应用中集成一个功能强大的Bootstrap Tree Table,从而提升用户在处理层级数据时的体验。同时,持续关注和更新相关库,确保能...

    27款jQuery Tree 树形结构插件

    - 可自定义规则和事件监听,且是收费的。 3. **jQuery File Tree** - 这是一个可配置的Ajax文件浏览器插件,允许通过CSS定制外观。 - 通过Ajax获取文件信息,可自定义展开/收缩事件和速度。 - 开源项目。 4. *...

    带有checkbox的权限树

    总的来说,"带有checkbox的权限树"是一种实用的权限管理工具,通过结合jQuery和`jquery-treeview`插件,开发者可以高效地创建出功能完善的权限分配界面。理解并掌握这一技术对于提升用户体验和简化权限管理流程具有...

    树状表格TreeGridView自定义控件,源码

    1. **控件组合**:自定义控件的关键在于将`TreeView`和`DataGridView`的功能融合。这通常涉及在控件内部管理两个子控件,并在适当的时候同步它们的状态,例如当`TreeView`中的节点被选中时,对应的`DataGridView`应...

    java 表格树

    在Java编程领域,"表格树"(Treetable)是一种复合控件,它结合了表格(Table)和树形视图(Tree)的功能,能够同时展示数据的层次结构和线性列表。这种组件通常用于数据组织复杂且具有层级关系的情况,如文件系统、...

Global site tag (gtag.js) - Google Analytics