JTree 类用于实现树,它的主要功能是把数据按照树状进行显示,可明确数据的层次关系。JTree 树中最基本的对象为节点,表示在给定层次结构中的数据项。树以垂直方式显示数据,每行显示一个节点。树中只有一个根节点,所有其他节点从这里引出。除根节点外,其他节点分为两类:一类是代子节点的分支节点,另一类是不带子节点的叶节点。
JTree 类实现树结构,常用构造方法如下:
- JTree():返回带有示例模型的 JTree
- JTree(Object[] value):返回 JTree,指定数组的每个元素作为不被显示的新根节点的子节点
- JTree(TreeNode root):返回 JTree,使用指定的 root 作为其根节点
- JTree(TreeNode root,boolean aslcsAllowsChildren):返回 JTree,使用指定的 root 作为其根节点,asksAllowsChildren 用 于确定节点是否为叶节点
JTree 类的常用方法如下:
本节主要介绍 TreeModel、TreeNode、TreeCellRender、TreeCellEditor 4个子类常用的方法。
- TreeModel :树模型,负责节点的操作,并通知UI刷新,一般使用默认Model就可以。TreeModel常用方法如下:
方法名及返回值类型 | 说明 |
---|---|
insertNodeInto | 在指定节点插入子节点 |
removeNodeFromParent | 将节点从父节点移除 |
getPathToRoot | 获取从当前节点到根节点的路径 |
- TreeNode :树节点,每个树节点可以获取到父节点和子节点的信息,构建成树结构。TreeNode常用的方法如下:
方法名及返回值类型 | 说明 |
---|---|
getParent | 获取父节点 |
getChildAt | 获取节点 |
getChildCount | 获取子节点个数 |
- TreeCellRender :渲染器,与table的CellRender类似。常用方法如下:
方法名及返回值类型 | 说明 |
---|---|
getTreeCellRendererComponent() | 设置树控件的风格 |
- TreeCellEditor :编辑器,与table的CellEditor类似。常用方法如下:
方法名及返回值类型 | 说明 |
---|---|
getTreeCellEditorComponent | 获取树的编辑器,可以自定义返回值 |
示例
继承 MyFrame 类,使用 JTree 类创建一个树控件,树控件的每个节点都有一个子节点,且层级数是无限的。具体实现代码如下:
package com.supermap.desktop.samplecode.swing.tree;
import com.supermap.desktop.samplecode.MyFrame;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import java.awt.*;
public class MyJTree extends MyFrame {
private MyJTree() {
JTree jTree = new JTree();
jTree.setModel(new DefaultTreeModel(new TreeNode()));
jTree.setCellRenderer(new DefaultTreeCellRenderer() {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
JLabel treeCellRendererComponent = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
treeCellRendererComponent.setText(String.valueOf(row));
return treeCellRendererComponent;
}
});
this.add(jTree);
}
class TreeNode extends DefaultMutableTreeNode {
public int getChildCount() {
return 1;
}
public javax.swing.tree.TreeNode getChildAt(int index) {
return new TreeNode();
}
}
public static void main(String[] args) {
MyJTree myJTree = new MyJTree();
myJTree.setVisible(true);
}
}
示例代码运行结果如下,树节点可以无限展开: