JTree树控件的使用(非常易懂)
树和节点的基本概念
树可以用图形的方式显示众多的节点以及它们之间的关系,最常见的树的例子就是目录树。 所有组成树的元素都成为节点(Node),一棵树的最顶层的节点称为根节点,如Program;而没有子节点的节点成为叶子节点,如domain。在层次结构中,上层的节点是下层节点的父节点,而下层节点是上层节点的子节点,如图:Program是C# Programs和Programs的父节点;FileBatchRemaer20070801094605是C# Programes的子节点。
有关树JTree的类和接口
JTree 显示树的核心基本类。 TreeModel 定义了树的数据模型接口 DefaultTreeModel 默认的树模型接口实现类 TreeModelListener 树模型的事件监听器 TreePath 树路径。一个路径就是一个对象数组,对应于树模型中从根节点到选定节点上的所有节点集合。数组的第一个元素是根节点,按树的层次关系依次在数组中给出中间节点,最后一个元素是选定的节点。 MutableTreeNode 树节点接口。对应树中的节点。树节点接口定义了与父子节点有关的方法。因此,利用树节点可以遍历整棵树。 DedaultMutableTreeNode 默认的树节点的实现类。 TreeSelectionModel 定义了在树上的选择节点的数据模型接口。树选择模型决定了选择节点的策略以及被选择节点的信息。 TreeSelectionModelListener 树选择模型事件的监听器。
代码实例:构建一棵树
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Java");
DefaultMutableTreeNode j2seNode=new DefaultMutableTreeNode("J2SE(JavaSE)"); DefaultMutableTreeNode swingNode=new DefaultMutableTreeNode("Swing"); DefaultMutableTreeNode socketNode=new DefaultMutableTreeNode("Socket"); DefaultMutableTreeNode threadNode=new DefaultMutableTreeNode("Thread"); j2seNode.add(swingNode); j2seNode.add(socketNode); j2seNode.add(threadNode);
DefaultMutableTreeNode j2eeNode=new DefaultMutableTreeNode("J2EE(JavaEE)"); DefaultMutableTreeNode jspservletNode=new DefaultMutableTreeNode("Jsp/Servlet"); DefaultMutableTreeNode jdbcNode=new DefaultMutableTreeNode("JDBC"); DefaultMutableTreeNode javaMailNode=new DefaultMutableTreeNode("Java Mail"); j2eeNode.add(jspservletNode); j2eeNode.add(jdbcNode); j2eeNode.add(javaMailNode);
root.add(j2seNode); root.add(j2eeNode); tree = new JTree(root);
相关语句解释
// 创建一个树节点,文字为J2SE(JavaSE) DefaultMutableTreeNode j2seNode=new DefaultMutableTreeNode("J2SE(JavaSE)");
// 创建一个文字为“Swing”的节点,添加在节点j2seNode下 DefaultMutableTreeNode swingNode=new DefaultMutableTreeNode("Swing"); j2seNode.add(swingNode);
// 创建一个文字为Java的节点作为根节点,然后以此根节点构建一棵树。j2seNode,j2eeNode挂在root 下 DefaultMutableTreeNode root = new DefaultMutableTreeNode("Java"); ....... root.add(j2seNode); root.add(j2eeNode); tree = new JTree(root);
注意: JTree和JTextArea,JTable一样,也需要放在一个JScrollPane中。
给树控件添加监听
tree.addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent evt) { // 取得选择状态变化的所有路径 TreePath[] paths = evt.getPaths(); for (int i=0; i<paths.length; i++) { // 如果处于选择状态 if (evt.isAddedPath(i)) { // 将路径转化为节点数组 Object[] nodes=paths[i].getPath(); // 得到最后一个节点,即选择的节点 DefaultMutableTreeNode node=(DefaultMutableTreeNode)nodes[nodes.length-1]; // 输出节点名 System.out.println(node.toString()); } } } });
额外的一点美化工作:渲染节点
// 设定叶节点图标 Icon leafIcon = new ImageIcon(TreePanel.class.getResource("/leaf.gif")); // 设定关闭状态节点图标 Icon closedIcon = new ImageIcon(TreePanel.class.getResource("/close.gif")); // 设定打开状态节点图标 Icon openIcon = new ImageIcon(TreePanel.class.getResource("/open.gif")); // 取得树的渲染器 DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer)tree.getCellRenderer(); renderer.setLeafIcon(leafIcon);// 设定叶节点图标 renderer.setClosedIcon(closedIcon);// 设定关闭状态节点图标 renderer.setOpenIcon(openIcon);// 设定打开状态节点图标