基础

树图形就像文件目录。由TreeNode表示节点,用TreePath表示这个节点的路径。

创建时,先创建根节点,然后创建子节点连接,类似于树的链式表示。

TreeNode 是一个接口,创建节点对象时,通常使用已实现该接口的的 DefaultMutableTreeNode 类。

DefaultMutableTreeNode

表示一个节点,可以进行增查改删等操作。

构造方法:

  • DefaultMutableTreeNode(Object userObject, boolean allowsChildren):userObject是用户对象(节点名称),allowsChildren是是否允许拥有子节点

方法:

  • add(): 添加子节点
  • insert(MutableTreeNode newChild, int childIndex) : 在指定位置插入子节点
  • getPreviousSibling(): 获得这个节点的前一个兄弟节点
  • getNextSibling()
  • getFirstChild()
  • remove(int childIndex): 移除子节点
  • remove(MutableTreeNode aChild);
  • removeAll()
  • getChildCount():获得子节点数量
  • getLeafCount(): 获得叶子结点数量
  • TreeNode getChildAt(int index): 获取指定位置子节点
  • TreeNode getChildAfter(TreeNode aChild): 获取子节点之后子节点
  • TreeNode getChildBefore(TreeNode aChild)
  • boolean isNodeChild(TreeNode aNode): 判断是否是aNode是否是这个节点子节点
  • TreeNode getParent(): 获得父节点,没有返回null
  • boolean isRoot(): 是否是根节点
  • boolean isLeaf()
  • int getLevel(): 返回这个节点的层数,如果是根节点就是0
  • TreeNode[] getPath(): 返回从根结点到这个节点的路径,第一个节点是根节点
  • Enumeration children(): 遍历子节点(不包括孙子节点)
  • Enumeration breadthFirstEnumeration(): 遍历树(广度遍历)
  • Enumeration depthFirstEnumeration(): 深度遍历
  • setUserObject(Object userObject)
  • Object getUserObject(): 获得节点名称

TreePath

一般使用方法:

TreeNode[] pathNodes = node.getPath();
TreePath treePath = new TreePath(pathNodes);

  • treePath.getPathCount(): 获得节点数量
  • treePath.getPath(): 获得路径上的节点
  • treePath.getParentPath(): 获得这个节点上一个节点路径
  • treePath.isDescendant(TreePath aTreePath): 判断aTreePath是否包含这个路径(判断aTreePath节点是否是子孙辈节点)

JTree

JTree负责把构造好的树显示出来。

构造方法:

  • JTree(TreeNode root): 由根节点就可以显示整个树
  • TreeModel treeModel = new DefaultTreeModel(TreeNode root):构建一个树模型. 然后JTree(treeModel)

方法:

  • TreePath getPathForRow(int row): 获得行索引。但是这个行索引实惠变化的,它不包括没有展开的。
  • int getRowForPath(TreePath path): 根据路径获得行索引
  • int getRowForLocation(int x, int y): 获得这个位置处的节点,可以和鼠标监听器一起使用。
  • TreePath getPathForLocation(int x, int y)
  • expandRow(int row): 展开节点
  • expandPath(TreePath path)
  • collapseRow(int row): 折叠节点
  • collapsePath(TreePath path)
  • isExpanded(int row): 节点是否处于展开状态
  • isExpanded(TreePath path)
  • setSelectionRow(int row): 设置当前选中的节点
  • setSelectionRow(int[] row)
  • setSelectionPath(TreePath path)
  • setSelectionPath(TreePath[] path): 多选
  • int[] getSelectionRows(): 获取当前选中的节点
  • TreePath getSelectionPath()
  • TreePath[] getSelectionPaths()
  • setRootVisible(boolean rootVisible): 是否显示根节点(默认显示)
  • setShowsRootHandles(boolean newValue): 是否显示根节点句柄(默认不显示)
  • setEditable(boolean flag)

设置节点样式:

首先创建节点渲染器DefaultTreeCellRenderer render = new DefaultTreeCellRenderer()

  • render.setOpenIcon(Icon newIcon): 设置节点展开时图标
  • render.setClosedIcon(Icon newIcon):
  • render.setLeafIcon(Icon newIcon): 叶子节点显示图标
  • render.setFont(Font font)
  • ender.setTextSelectionColor(Color newColor):选中时颜色
  • render.setTextNonSelectionColor(Color newColor)
  • render.setBackgroundSelectionColor(Color newColor): 选中时背景颜色
  • render.setBackgroundNonSelectionColor(Color newColor)

之后设置节点渲染器jTree.setCellRenderer(render)

监听器:

  • addTreeExpansionListener: 节点展开/折叠监听器
  • addTreeWillExpandListener: 功能和上面相同,但是先执行
  • addTreeSelectionListener: 节点被选中监听器
  • tree.getModel().addTreeModelListener: 节点增删改监听器
public class Tree
{
public Tree(String name)
{
JFrame frame = new JFrame(name);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

DefaultMutableTreeNode treeroot = new DefaultMutableTreeNode();
Object[] treename = new Object[]{"C", "D", "E", "H"};
for(int i=0; i<treename.length; i++)
{
treeroot.add(new DefaultMutableTreeNode(treename[i])) ;
}
Object[] C_treename = new Object[]{"user", "program", "data"};
DefaultMutableTreeNode C_treenode = (DefaultMutableTreeNode) treeroot.getChildAt(0);
for(int i=0; i<C_treename.length; i++)
{
C_treenode.add(new DefaultMutableTreeNode(C_treename[i])) ;
}
JTree tree = new JTree(treeroot);
tree.setEditable(true);
tree.setRootVisible(false);
tree.setShowsRootHandles(true);
frame.add(tree);

}
}