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; } }
相关推荐
3. **动态插入节点**:接收到服务器返回的数据后,使用Bootstrap Treeview提供的API,如`addNode`或`reload`方法,将新数据动态插入到现有树结构中。 4. **缓存管理**:为了提高性能,可以考虑缓存已加载的节点数据...
这个压缩包中的文件,"bootstrapTable.treeview使用示例",可能是一个HTML文件,包含了一个已经配置好的表格,展示了如何使用JavaScript来启用 `treeview` 功能。通常,这样的示例会包括以下关键部分: 1. **HTML...
开发者需要了解TreeTable提供的API,如添加、删除、移动节点,以及监听展开、折叠、点击等事件,以实现动态交互和业务逻辑。 7. **用户体验** 设计良好的TreeTable应该考虑用户体验,包括清晰的视觉指示(如折叠...
4. 可选地,根据需要添加自定义事件监听器和扩展功能。 通过以上步骤,你可以在你的Web应用中集成一个功能强大的Bootstrap Tree Table,从而提升用户在处理层级数据时的体验。同时,持续关注和更新相关库,确保能...
4. **数据绑定**:使用JavaFX的数据绑定机制,将`TreeItem`的属性与列进行绑定,确保数据更新时视图自动同步。 5. **事件处理**:添加监听器来处理用户的交互事件,如点击、展开或折叠节点。 6. **样式和布局**:...
1. **控件组合**:自定义控件的关键在于将`TreeView`和`DataGridView`的功能融合。这通常涉及在控件内部管理两个子控件,并在适当的时候同步它们的状态,例如当`TreeView`中的节点被选中时,对应的`DataGridView`应...
- 可自定义规则和事件监听,且是收费的。 3. **jQuery File Tree** - 这是一个可配置的Ajax文件浏览器插件,允许通过CSS定制外观。 - 通过Ajax获取文件信息,可自定义展开/收缩事件和速度。 - 开源项目。 4. *...
总的来说,"带有checkbox的权限树"是一种实用的权限管理工具,通过结合jQuery和`jquery-treeview`插件,开发者可以高效地创建出功能完善的权限分配界面。理解并掌握这一技术对于提升用户体验和简化权限管理流程具有...
在Java编程领域,"表格树"(Treetable)是一种复合控件,它结合了表格(Table)和树形视图(Tree)的功能,能够同时展示数据的层次结构和线性列表。这种组件通常用于数据组织复杂且具有层级关系的情况,如文件系统、...