和风细雨

世上本无难事,心以为难,斯乃真难。苟不存一难之见于心,则运用之术自出。

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);// 设定打开状态节点图标

 

posted on 2008-03-03 23:02 和风细雨 阅读(2407) 评论(6)  编辑  收藏 所属分类: Swing

评论

# re: JTree树控件的使用 2008-04-06 11:43 蓝狐

喜欢的风格,能否交个朋友啊?我的MSN:zrz55661@hotmail.com  回复  更多评论   

# re: JTree树控件的使用 2008-04-06 15:46 和风细雨

有朋自远方来,不亦乐乎。msn已经加你了。  回复  更多评论   

# re: JTree树控件的使用[未登录] 2008-04-10 13:28 JAVA初学者

我也是JAVA开发的,能否交个朋友啊,我的MSN:tianjin_123@hotmail.com  回复  更多评论   

# re: JTree树控件的使用 2008-04-10 22:07 YANGH-7

谢谢,我是Java初学者,现在学点Java Swing的东西,感到挺吃力,看了你讲的关于JTree的东西,好理解多了,原来都在看文档头晕啊  回复  更多评论   

# re: JTree树控件的使用[未登录] 2008-04-17 16:34 Lucifer

和风细雨你好!看了你的博客我很振奋,xjynxf@hotmail.com我的MSN,很想跟你交朋友!请加我。  回复  更多评论   

# re: JTree树控件的使用 2009-05-18 16:49 来访者

你好,我想问你一下是否可以在叶子节点的内容部分用某个组件来表示。例如我想用一个带有图像和文字的组件来表示你例子中的Swing,如果方便的话,添加我的msn:wensheng2007@gmail.com  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: