JTree使用
- 格式:docx
- 大小:868.41 KB
- 文档页数:13
JTree使用
如何使用 Jtree
(1)创建树
(2)对节点的选择做出响应
(3)自定义树的外观表现
(4)动态改变一棵树
(5)创建树的数据模型
(6)懒加载孩子
(7)如何写expansion linstener
(8)如何写tree-will-expand listener
利用 JTree 类,你可以显示等级体系的数据。一个 JTree 对象并没有包含实际的数据;它只是提供了数据的一个视图。像其他非平凡的( nontrivial ) Swing 组件一样,这
种 Jtree 通过查询她的数据模型获得数据。这是一个 Jtree :
如上面的图片所显示, Jtree 垂直显示它的数据。树中显示的每一行包含一项数据,称之为节点( node )。每颗树有一个根节点( root node ),其他所有节点是它的子孙。默认情况下,树只显示根节点,但是你可以设置改变默认显示方式。一个节点可以拥有孩子也可以不拥有任何子孙。我们称那些可以拥有孩子(不管当前是否有孩子)的节点为“分支节点”( branch nodes ),而不能拥有孩子的节点为“叶子节点”( leaf nodes )。
分支节点可以有任意多个孩子。通常,用户可以通过点击实现展开或者折叠分支节点,使得他们的孩子可见或者不可见。默认情况下,除了根节点以外的所有分支节点默认呈现折叠状态。程序中,通过监听 tree expansion或者 tree-will-expand 事件可以检测分支节点的展开状态。监听事件在下面两节内容中描述How to Write a Tree Expansion
Listener and How to Write a Tree-Will-Expand Listener .
在树中,一个节点可以通过 TreePath (一个囊括该节点和他所有祖先节点的路径对象)或者他的折叠行来识别。
展开节点( expanded node )就是一个非叶子节点,当他的所有祖先都展开时,他将显示他的孩子。
折叠节点( collapsed node )是隐藏了孩子们得的节点。
隐藏节点( hidden node )就是折叠节点下的一个孩子
( Jtree )。
pane 上
Java代码
以下代码创建根节点以下的节点Java代码 树上。接下来的代码显示了 TreeDemo.java 中有关选择的代码:Java代码 21. displayURL(book.bookURL);
22. } else {
23. displayURL(helpURL);
24. }
25.}
上面的代码执行了一下任务:
1 .获得树的默认 TreeSelectionModel (节点选择模式),然后设置它,使得在某一时刻只有一个节点被选中。
2 .注册了一个事件处理器。事件处理器是一个实现了
TreeSelectionListener 接口的对象。
3. 在事件处理器中,通过调用 Tree 的
getLastSelectedPathComponent 方法获得选中的节点。
4 .使用 getUserObject 方法获得节点关联的数据。(节点
node 是一个非平凡组件,要通过它关联的数据模型获得真正的数据)
这里给出一些树节点的图片,分别通过 Java 、 Windows 和
MacOS 样式绘得。
(依次为 java look 、 windows look 和 MacOS look )
像之前图片显示一样,一棵树按照惯例,对于每个基点显示了一个图标和一些文字。像我们简短的展示一样,你可以指定这些样式。
一棵树通常表现一些外观和样式特效,通过不同的绘制图形指示节点间的关系。你可以在限制范围内自定义这些图形。首先,你可以使用 tree.setRootVisible(true) 设置显示根节点或者
tree.setRootVisible(false) 隐藏根节点。其次,你可以使
用 tree.setShowsRootHandles(true) 请求设置树的顶层节点具有句柄( +- 图标,点击句柄使其展开折叠)。如果顶层节点是根节点的话,需要保证它是可视的,如果是顶层节点则每个孩子都显示句柄。
如果你使用 Java 样式,你可以自定是否在节点间显示行线来表现他们的关系。默认情况下, Java 样式使用“角线”(类似“ L ”)。通过设置 Jtree.lineStyle 的客户端属性,你可以指定一种不同的标准。例如,通过以下代码,这只 JAVA 样式仅使用水平线隔开一组节点:
Java代码
Java代码
接下来的一些截图显示了设置不同的 Jtree.lineStyle 属性(使用
JAVA 样式)
Java代码
这是一个截图:
Java代码
视 tree 中增加或者移除节点。你也可以编辑每个节点的文本。 Java代码
Java代码
Java代码
30. }
31.return childNode;
32.}
用tree model做为JTree的构造函数的参数,节点的文本改变监听器是注册在model上,而节点增删是通过ActionListener监听按钮事件
这段代码创建一个节点,插入 tree model 中。如果可以的话,讲请求该节点的上层节点展开, tree 滚动,这样新节点就可视了。这段代码使用 DefaultTreeModel 类提供
的 insertNodeInto 方法向 tree model 插入新节点。
(5)创建一个数据模型
如果 DefaultTreeModel 不能符合你的需求,则需要你自定义一个 data model 。你
的 data model 必须实现TreeModel 接口。 TreeModel 指定获取树中特定节点、获取特定节的孩子数量、确定一个节点是否为叶子、通知model 树的改变和增加删除 tree model 监听器的方法。
有趣的是, TreeModel 接口接受各种对象作为树节点。这就不需要通过 TreeNode 对象来表现节点,节点甚至不需要实现 TreeNode
接口。因此,如果 TreeNode 接口不适合你的 tree model, 大可自由的设计自己的节点表现形式。例如,如果一个事前存在的阶级数据结构( hierarchical data structure ),你就不需要复制或者强制把他放进 TreeNode 模子中。你只需实现你的 tree model ,这样你就可以使用已经存在的数据结构。
下面图片展示了一个叫GenealogyExample(家谱例子),他展示了某一个人的子孙和祖先。
在GenealogyModel.java
中,你可以找到这个自定义的tree model的实现。因为这个model通过一
个DefaultTreeModel的子类实现,他必须实现TreeModel接口。这就需要实现获得节点信息的一系列方法,例如,哪个是根节点、某个节点的子孙是哪些节点。在GenealogyModel的例子中,每个节点表现为一个Person类型的对象,这是一个未实现TreeNode接口的自定义类。
一个tree model一定要实现一些方法,用于增删tree model
listeners(监听器),当树的数据结构或者数据被改变时,必须把TreeModelEvents(tree model事件)响应到这些监听器。
Java代码
Java代码
我们在一个方法中声明两个孩子:Java代码
次 tree expansion 事件发生的消息。这是一个简单易懂的演示。
Java代码 * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All
rights reserved.
*
* Redistribution and use in source and binary forms, with or
without * modification, are permitted provided that the following
conditions * are met:
*
* - Redistributions of source code must retain the above
copyright * notice, this list of conditions and the following
disclaimer. *
* - Redistributions in binary form must reproduce the above
copyright * notice, this list of conditions and the following
disclaimer in the
* documentation and/or other materials provided with the
distribution. * * - Neither the name of Oracle or the names of its
* contributors may be used to endorse or promote products
derived * from this software without specific prior written
permission. *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO
EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF