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; } }
相关推荐
本文将深入探讨这两种控件的主要属性和方法,帮助初学者更好地理解和使用它们。 **ComboBox** 是一个组合了文本输入框和下拉列表的控件,通常用于提供一组预定义选项供用户选择。它的主要属性和方法包括: 1. **...
3. **动态插入节点**:接收到服务器返回的数据后,使用Bootstrap Treeview提供的API,如`addNode`或`reload`方法,将新数据动态插入到现有树结构中。 4. **缓存管理**:为了提高性能,可以考虑缓存已加载的节点数据...
- 在Windows Forms应用中,通常使用`System.Windows.Forms.TreeView`控件和`System.Windows.Forms.DataGridView`控件组合来实现TreeTable效果,或者使用第三方库如DevExpress、Telerik等提供的高级控件。...
在IT行业中,`TreeView`控件是常见的图形用户界面元素,尤其在Windows应用程序开发中广泛使用,如.NET Framework的WinForms或WPF等框架。它主要用于显示层次化的数据结构,通常表现为树状视图,用户可以展开、折叠...
在实际应用中,开发TreeTable可以使用各种编程语言和框架,如JavaScript中的jQuery TreeTable插件,Java中的Swing或JavaFX TreeTableView,.NET Framework中的WPF TreeView结合DataGrid,或者在Web开发中使用React、...
然后,你需要创建一个`TreeView`对象,并设置必要的属性,如根节点、展开策略等。接着,你可以创建自定义的`TreeAdapter`来处理数据,并将其绑定到`TreeView`上。节点的数据通常以`TreeNode`对象的形式存在,你可以...
在本文中,我们将使用 Bootstrap Treeview 实现动态加载数据,并添加快捷搜索功能,以实现快速查询省市区的区域名称信息。 数据表结构 数据源为省市区地域信息表,该表为自关联结构。本文将使用该表中的数据来动态...
8. **自定义节点旁的图标**:通过`ExpandedImageUrl`、`ImageUrl`、`SelectedImageUrl`这三个属性,可以根据节点的不同状态选择合适的图标,从而提升界面的美观度和功能性。 以上详细介绍了`TreeView`控件的常用...
本篇文章将深入探讨"VS之treeview使用"的相关知识点。 一、TreeView控件简介 TreeView控件是一个可视化的控件,它可以显示一个层次结构的节点,每个节点可以包含子节点。每个节点称为TreeNode,可以包含文本、图像...
在PowerBuilder中,使用TreeView控件的一般步骤包括: 1. 创建应用程序并建立与数据库的接口,这是进行数据操作的基础。 2. 在应用窗口中添加DataWindow控件(如dw_3和dw_4)和TreeView控件(如TV_1)。 3. 修改DW_...
本文将深入探讨如何自定义绘制`TreeView`并实现多选功能,同时介绍如何修改`TreeNode`的样式,添加背景板,改变字体,并在节点后添加按钮。 首先,`TreeView`控件的默认行为不支持多选。为了实现多选功能,我们需要...
本文将深入探讨如何利用Qt QML实现一个功能丰富的树形控件,包括递归显示、节点展开与折叠、选中效果、点击事件以及使用tag属性来传递额外数据。 首先,我们要导入必要的QML模块,特别是`QtQuick.Controls`模块,它...
在具体实现中,我们可以通过监听`TreeView`的`AfterSelect`事件,获取选中的节点,然后使用其`Tag`属性(通常用来存储额外信息)作为查询条件,填充`DataGridView`的数据源。例如: ```csharp private void ...
首先,创建一个新的`TreeNode`对象,设置其文本属性(即节点显示的文本),然后使用`TreeView`的`Nodes`集合的`Add`方法将其添加到树中。例如: ```csharp TreeNode newNode = new TreeNode("新节点"); treeView1...
下面将详细解释TreeView的使用及其相关知识点。 1. TreeView控件简介: TreeView控件是Windows Forms和.NET Framework中的一种控件,用于展示具有层级结构的数据。每个节点(TreeNode)可以代表一个数据项,并且...
在Windows Presentation Foundation(WPF)中,TreeTable是一种结合了TreeView和DataGrid功能的控件,它将数据以树状结构展示,并且每个节点可以展开显示详细的数据表格。这种控件在处理层次结构数据时非常有用,...
默认情况下,`TreeView`控件并不直接支持复选框功能,但可以通过自定义绘图或者使用特定的API来实现这一功能。 在.NET Framework或者WPF等开发环境中,我们可以利用`TreeNode`的`Checked`属性来管理复选框的状态。...
`TreeView`和`ListView`是Windows Forms开发中的强大工具,结合使用可以构建出功能丰富的界面。通过事件监听和数据绑定,可以轻松实现类似资源管理器的功能,提供用户友好的交互体验。理解并熟练掌握这两种控件的...
下面我们将深入探讨`TreeView`的使用及其相关知识点。 1. **基本概念**:`TreeView`控件由一个或多个`TreeNode`对象组成,每个`TreeNode`代表树结构中的一个节点,可以包含子节点(即嵌套的`TreeNode`)。根节点...
TreeView控件的节点绑定可以通过使用TreeNode对象和TreeView控件的Nodes属性来实现。在上面的代码中,我们使用了foreach循环来遍历DataSet中的数据,并创建相应的TreeNode对象,然后将其添加到TreeView控件上。 ...