JTree也是一个分层显示数据的组件,它在Swing里复杂度算是中等,涉及的类不是很多,也没有复杂的UI,所以单独对一个树来说,构造和渲染都不难,对于树的操作比较麻烦的是拖拽和与其他组件数据交互.
对于JTree有几个比较重要的类和接口: TreeMode是一个接口,用来构建树的模型,实现这个接口之后我们可以把一些比较另类的组件抽象成一棵树,TreeTable就是这个原理实现的;TreeNode是一个接口,代表树的节点,DefaultMutableTreeNode是该接口的一个实现,我们一般构建树使用它就可以了,当然也可以继承它添加新的功能,或者实现TreeNode把节点变成其它组件; TreePath是一个类,负责节点到根的路径,一般不需要我们来修改; TreeSelectionModel是一个接口,表示树选择组件的当前状态,只是使用皆可以了,一般除非做很大的改动,否则不需要修改这个类;还有就是TreeCellRenderer和TreeCellEditor了,它们是树的渲染器,实现特殊效果都需要实现它们;还有就是TreeUI了,树的UI比较死板,很少需要修改.
由上面类和接口可以,树还是一个不是很复杂的组件的,除了基本使用外,我们一般会用到的也就是对Cell进行渲染,替换树的节点图片,或者给节点加个CheckBox这些了.
先看树的简单使用,Sun官方给我们提供了例子:
这个例子只是简单的构建一棵树:
// Create the root nodes.
DefaultMutableTreeNode top = new DefaultMutableTreeNode(
"The Java Series");
//add node
createNodes(top);
// Create a tree that allows one selection at a time.
tree = new JTree(top);
tree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION);
当然我们也可以先创建树,再设置数据,这都是JTree的构造函数,本质上是没区别的,最终JTree也是通过setModel设置数据的:
tree = new JTree();
tree.setModel(treeModel);
构造完树之后还要把树放在JScollPanel上,否则树显示会有问题:
// Create the scroll pane and add the tree to it.
JScrollPane treeView = new JScrollPane(tree);
到此为止,树就完成了,当然Sun也提供了许多方法便捷于我们操作树:
取得根节点:
// get the tree root node
TreeNode rootNode = (TreeNode)tree.getModel().getRoot();
取得树的数据模型:
// get the tree model.
DefaultTreeModel treeModel = (DefaultTreeModel)tree.getModel();
取得树的某一个节点的位置:
// get tree node path.
TreePath nodePath = new TreePath(treeModel.getPathToRoot(node));
设置节点的展开可见和选择:
//select the node.
tree.setSelectionPath(nodePath);
// Ensures that the node identified by path is currently viewable.
tree.makeVisible(nodePath);
展开后滚动至节点可见:
// Makes sure all the path components display
tree.scrollPathToVisible(nodePath);
还有一个是设置鼠标点击展开树节点的(默认是双击,改成了0就是不可点击):
// Sets the number of mouse clicks before a node will expand or close.
tree.setToggleClickCount(1);
另外就是一个设置Cell的高度的,但这个方法我们一般不用,大多时候是在Renderer里设置的,因为这样设置可能有UI问题:
// Sets the height of each cell, in pixels.
tree.setRowHeight(15);
其它还有很多,因为JTree继承JComponent,所以它有父类的所有方法,我们通过setXXX和getXXX就可以设置了.
说完基本的设置之后,说一下JTree的事件:
JTree继承JComponent,所以它有JComponent的事件,但我们一般只关注鼠标的键盘的:
// add mouse listener
tree.addMouseListener(this);
// add key listener
tree.addKeyListener(this);
然后是JTree独有的事件:
tree.addTreeExpansionListener(this);
tree.addTreeWillExpandListener(this);
tree.addTreeSelectionListener(this);
分别是树节点展开(折叠)、树节点将要展开(折叠)和树节点选择事件,我们一般用的多的是addTreeExpansionListener和addTreeSelectionListener事件:
事件处理都不是很复杂,增加监听后实现方法就可以了,需要注意的是TreeSelectionListener和MouseListener,它们有事件重叠的地方:但在树的节点点击鼠标左键时触发这两个事件,点击右键时触发鼠标事件,所以这两个事件都做监听时,处理一定要注意:
先看TreeSelectionListener的处理:
@Override
publicvoid valueChanged(TreeSelectionEvent event) {
然后可以取得TreePath,之后取得Node
// Returns the current lead path.
TreePath newPath = event.getNewLeadSelectionPath();
TreePath oldPath = event.getOldLeadSelectionPath();
或者通过JTree取得Node
JTree tree = (JTree) event.getSource();
tree.getLastSelectedPathComponent();
再看MouseListener的处理:
@Override
publicvoid mouseClicked(MouseEvent e) {
鼠标组件场合比较简单,因为这个时候节点被选中:
if (SwingUtilities.isLeftMouseButton(e)
&& e.getClickCount() == 1) {
// Returns the last path component
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
.getLastSelectedPathComponent();
}
右键则要得出节点位置再处理:
if (SwingUtilities.isRightMouseButton(e)) {
// Returns the row for the specified location.
int selectRow = tree.getRowForLocation(e.getX(), e.getY());
// Returns the path for the node at the specified location.
TreePath selectPath = tree.getPathForLocation(e.getX(), e
.getY());
if (selectPath != null) {
// set select
tree.setSelectionPath(selectPath);
// get tree node.
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) selectPath.getLastPathComponent();
}
之后有了树和选择节点就可以做自己的业务逻辑了.
另外JTree的节点的增加、修改和删除也需要看一下,如果我们使用DefaultTreeModel的话,这些操作都很简单,通过它的insertNodeInto、
removeNodeFromParent、nodeChanged等方法就可以实现了,但是如果是我们自己实现的TreeModel,必须再做完数据的操作之后UpdateUI更新界面,
或者学习Sun的事件机制,触发事件然后在View层更新画面,一般都不推荐这么做,除非你的TreeModel的数据特别复杂,没办法使用DefaultTreeModel
这个数据容器,例如TreeTable.
到此,除了JTree的Renderer和Editor之外,只剩下JTree的取数据了.JTree的数据取得我们一般都是用递归,这儿写个从任何节点递归其下所有的例子:
private List<TreeNode> treeNodeList = new ArrayList<TreeNode>();
publicvoid getChildNodeList(TreeNode treeNode) {
if (treeNode == null) {
thrownew RuntimeException("error treenode.");
}
if (treeNodeList == null) {
treeNodeList = new ArrayList<TreeNode>();
}
if (treeNode.getChildCount() >= 0) {
for (Enumeration<TreeNode> e = treeNode.children(); e
.hasMoreElements();) {
TreeNode childNode = (TreeNode) e.nextElement();
treeNodeList.add(childNode);
getChildNodeList(childNode);
}
}
}
最后我们看一个Renderer的例子,Sun官方提供的:
首先看它的Renderer实现,这个是直接继承DefaultTreeCellRenderer
privateclass MyRenderer extends DefaultTreeCellRenderer {
然后复写它的getTreeCellRendererComponent方法:
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
它的默认实现时一个JLabel,在里面我们就可以设置它的效果了,这里设置一个图片:
setIcon(tutorialIcon);
当然我们也可以继承其它组件,实现TreeCellRenderer接口,实现更多效果.
使用很简单,直接使用JTree的setCellRenderer方法就可以了:
tree.setCellRenderer(new MyRenderer(tutorialIcon));
总结,基本树的操作和呈现设置都这里就完成了,可以看出,树还是比较简单的,后面我预计还有两个主题,一个是关于JTree的Renderer和Editor的,在那儿实现一棵树的节点的图片特性,可用与否,选择隐藏等;另外就是关于树的选择框了,其实也是Renderer和Editor的使用,只不过为了逻辑和应用,做的更复杂.
分享到:
相关推荐
### 如何使用JTree:详解与实践 #### JTree简介 `JTree`是Java Swing中的一个组件,用于展示层次化的数据结构。它允许用户在应用程序中构建树形视图来表示目录结构、组织结构图等。`JTree`继承自`JComponent`类,...
在Java的Swing库中,`JTree`组件是一个用于展示层次数据的控件,它以树状结构显示数据。`jtree`标题所指的可能是关于如何在`JTree`中添加复选框(checkboxes)的功能。这通常是为了让用户能够多选树中的节点,进行...
在Java Swing库中,`JTree`是一个非常重要的组件,用于显示和操作树形数据结构。这个例子展示了如何实现一个可拖动节点的`JTree`,这在用户界面设计中是一个常见且实用的功能,特别是在需要展示层次结构信息时。`...
在Java Swing库中,`JTree`和`JTable`是两种非常重要的组件,用于创建用户界面。`JTree`通常用于展示层次化的数据结构,而`JTable`则适用于二维表格数据的显示和操作。本项目是关于如何在Java应用程序中结合使用这两...
在Java Swing库中,JTree和JTable是两个非常重要的组件,它们被广泛用于构建用户界面,特别是处理数据展示和交互。JTree用于显示层次结构的数据,而JTable则适用于二维表格形式的数据展现。 首先,我们来深入了解...
在Java编程中,`JTree`是Swing库中的一个组件,用于展示树形数据结构。这个组件在GUI(图形用户界面)应用中非常常见,因为它可以清晰地展示层次关系的数据,比如文件系统目录结构。在Java中动态实现二叉树,即在...
### JTree用法详解:Swing中的树状结构控件 在Java Swing中,`JTree`是一个非常重要的组件,用于展示层次结构的数据,如文件系统、组织结构图等。本文将详细介绍`JTree`的各种使用方法,包括如何创建、自定义外观、...
实现jTable和jTree的双向联动,点击jTree会选中jTable单元格,点击jTable会选中jTree节点。
在Java Swing库中,JTree是一个非常有用的组件,它用于展示层次结构的数据,例如文件系统、组织结构等。"jtree带复选框的例子"是一个关于如何在JTree中实现节点选择功能的示例,其中每个节点都有一个复选框供用户...
在IT领域,尤其是在Web开发中,`JTree`是一个常用组件,它用于在用户界面中展示数据的层次结构,比如文件系统、组织架构等。在本案例中,我们讨论的是一个使用JavaScript实现的JTree,这通常是通过HTML、CSS和...
在IT领域,JTree是一种广泛使用的Java Swing组件,它允许用户以树形结构来展示数据。这个组件在GUI(图形用户界面)应用中特别常见,因为它能清晰地组织层次化的信息,比如文件系统目录、数据库结构或者项目组织。...
在Java Swing中,JTree是一个非常重要的组件,用于展示层次结构的数据,通常以树状的形式显示。它在各种用户界面中都有广泛的应用,例如文件系统浏览、组织结构展示等。本教程将深入讲解如何使用JTree以及相关的操作...
### Java组件之JTree使用详解 #### 一、引言 `JTree`是Java Swing中的一个重要组件,用于展示层次化的数据结构。它提供了一种直观的方式来表示具有层级关系的数据,例如文件系统的目录结构或者组织架构等。本文将...
### JTree的用法详解 #### 一、引言 `JTree` 是 Java Swing 库中的一个重要组件,用于在图形用户界面 (GUI) 中显示层次结构数据。它非常适合用来展示具有分层关系的信息,例如文件系统目录结构、组织结构等。 ####...
在Java Swing库中,`JTree`组件是一个用于展示树形数据结构的可视化元素,它允许用户通过交互来浏览和操作这些数据。当我们在`JTree`中添加了复选框(CheckBox),我们增强了它的功能,使用户可以对每个节点进行选择...
在Java Swing库中,JTree组件是一个非常有用的可视化控件,用于展示层次化的数据结构,如文件系统目录或组织结构图。这篇博文将探讨如何在Java应用程序中有效地使用JTree。 首先,理解JTree的基本概念至关重要。...
JTree设置不同图标 在 Java 中,JTree 是一个非常有用的组件,常用于显示树形结构的数据。但是,JAVA 自带的 JTree 功能狭窄,运用起来非常的不方便,不灵活。例如,在已经添加的节点中不能更改其文本信息和图片...
**JTree的Doc文档详解** Java Swing库中的`JTree`组件是用于显示和操作树状数据结构的可视化工具。这个组件允许用户以图形化的方式查看层次化的信息,如文件系统目录、数据库结构或者应用程序的对象模型。在Java...
**JTree 2.0:构建直观的目录树视图** `JTree`是Java Swing库中的一个组件,用于在用户界面中展示层次结构数据,通常表现为目录树的形式。在`JTree2.0`版本中,这个组件得到了进一步的改进和增强,提供更丰富的功能...