import  java.awt.Dimension;

import  java.awt.Color;

import  javax.swing.JFrame;

import  javax.swing.JPanel;

import  javax.swing.JScrollPane;

import  javax.swing.JTree;

import  javax.swing.BoxLayout;

import  javax.swing.tree.TreePath;

import  javax.swing.tree.DefaultMutableTreeNode;

import  javax.swing.tree.DefaultTreeModel;

/* 

JTree的构造函数:

JTree()

JTree(Hashtable value)

JTree(Object[] value)//只有这个构造函数可以创建多个根结点

JTree(TreeModel newModel)

JTree(TreeNode root)

JTree(TreeNode root, boolean asksAllowsChildren)

JTree(Vector value)



*/ 

public   class  JTreeDemo

{

  public   static   void  main (String[] args)

 {





   // 构造函数:JTree() 

  JTree example1  =   new  JTree();



 



  

   // 构造函数:JTree(Object[] value) 

  Object[] letters =  { " a " ,  " b " ,  " c " ,  " d " ,  " e " };

  JTree example2  =   new  JTree (letters);



 





   // 构造函数:JTree(TreeNode root)(TreeNode空)

   // 用空结点创建树 

  DefaultMutableTreeNode node1  =   new  DefaultMutableTreeNode(); // 定义树结点 

  JTree example3  =   new  JTree (node1); // 用此树结点做参数调用 JTree的构造函数创建含有一个根结点的树



 





   // 构造函数:JTree(TreeNode root)(同上,只是TreeNode非空)

   // 用一个根结点创建树 

  DefaultMutableTreeNode node2  =   new  DefaultMutableTreeNode( " Color " );

  JTree example4  =   new  JTree (node2); // 结点不可以颜色,默认为白面黑字 

  example4.setBackground (Color.lightGray);



 





   // 构造函数:JTree(TreeNode root, boolean asksAllowsChildren)(同上,只是TreeNode又有不同)

   // 使用DefaultMutableTreeNode类先用一个根结点创建树,设置为可添加孩子结点,再添加孩子结点 

  DefaultMutableTreeNode color  =   new  DefaultMutableTreeNode( " Color " ,  true );

  DefaultMutableTreeNode gray  =   new  DefaultMutableTreeNode ( " Gray " );

  color.add (gray);

  color.add ( new  DefaultMutableTreeNode ( " Red " ));

  gray.add ( new  DefaultMutableTreeNode ( " Lightgray " ));

  gray.add ( new  DefaultMutableTreeNode ( " Darkgray " ));

  color.add ( new  DefaultMutableTreeNode ( " Green " ));

  JTree example5  =   new  JTree (color);

  

  

  

  

   // 构造函数:JTree(TreeNode root)(同上,只是TreeNode非空)

   // 通过逐个添加结点创建树 

  DefaultMutableTreeNode biology  =   new  DefaultMutableTreeNode ( " Biology " );

  DefaultMutableTreeNode animal  =   new  DefaultMutableTreeNode ( " Animal " );

  DefaultMutableTreeNode mammal  =   new  DefaultMutableTreeNode ( " Mammal " );

  DefaultMutableTreeNode horse  =   new  DefaultMutableTreeNode ( " Horse " );

  mammal.add (horse);

  animal.add (mammal);

  biology.add (animal);

  JTree example6  =   new  JTree (biology);

  horse.isLeaf();

  horse.isRoot();

  

  





   // 构造函数:JTree(TreeModel newModel)

   // 用DefaultMutableTreeNodel类定义一个结点再用这个结点做参数定义一个用DefaultTreeMode

   // 创建一个树的模型,再用JTree的构造函数创建一个树 

  

  DefaultMutableTreeNode root  =   new  DefaultMutableTreeNode ( " Root1 " );

  DefaultMutableTreeNode child1  =   new  DefaultMutableTreeNode ( " Child1 " );

  DefaultMutableTreeNode child11  =   new  DefaultMutableTreeNode ( " Child11 " );

  DefaultMutableTreeNode child111  =   new  DefaultMutableTreeNode ( " Child111 " );

  root.add (child1); child1.add (child11); child11.add (child111);

  

  

  

  DefaultTreeModel model  =   new  DefaultTreeModel (root);

  

  JTree example7  =   new  JTree (model);



 



  JPanel panel  =   new  JPanel();

  panel.setLayout ( new  BoxLayout (panel, BoxLayout.X_AXIS));

  panel.setPreferredSize ( ));

  panel.add ( new  JScrollPane (example1)); // JTree必须放在JScrollPane上 

  panel.add ( new  JScrollPane (example2));

  panel.add ( new  JScrollPane (example3));

  panel.add ( new  JScrollPane (example4));

  panel.add ( new  JScrollPane (example5));

  panel.add ( new  JScrollPane (example6));

  panel.add ( new  JScrollPane (example7));

  



 



  JFrame frame  =   new  JFrame ( " JTreeDemo " );

  frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

  frame.setContentPane (panel);

  frame.pack();

  frame.show();

 }

}

在实际开发过程中会经常使用JTree组件,平时会遇到这样或那样的问题,在此将偶得一点经验写下来,与大家共享,希望对大家有所帮助。

private JTree jtNetDevice;//数组件申明

private JScrollPane jspTree;//滚动面板申明

1、初始化

    DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("root");

    jtNetDevice = new JTree(rootNode);

    jtNetDevice.setAutoscrolls(true);

    getTreeSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);//设置单选模式

    jspTree = new JScrollPane();

    jspTree.getViewport().add(jtNetDevice, null);

2、三个经常使用的取值函数

  private DefaultTreeModel getTreeModel(){

    return (DefaultTreeModel)jtNetDevice.getModel();

  }

private DefaultMutableTreeNode getRootNode(){

    return (DefaultMutableTreeNode)getTreeModel().getRoot();

  }

  

  private TreeSelectionModel getTreeSelectionModel(){

    return jtNetDevice.getSelectionModel();

  }

3、根据node得到path:

  TreePath visiblePath = new TreePath(getTreeModel().getPathToRoot(node));

4、根据Path展开到该节点

  jtNetDevice.makeVisible(visiblePath);

5、根据path设定该节点选定

  jtNetDevice.setSelectionPath(visiblePath);

6、选中节点的方法

  首先,根据节点得到树路径,其中chosen为需要选中的节点

  TreePath visiblePath = new TreePath( ( (DefaultTreeModel) jtNetDevice.getModel()).

                                        getPathToRoot(chosen));

  然后根据Path选中该节点

  jtNetDevice.setSelectionPath(visiblePath);

7、滚动到可见位置

  jtNetDevice.scrollPathToVisible(visiblePath);

8、给JTree添加右键弹出菜单

  void jtNetDevice_mouseReleased(MouseEvent e) {

    if (e.isPopupTrigger()) {

      jPopupMenu1.show(e.getComponent(), e.getX(), e.getY());//弹出右键菜单

    }

  }

9、关于JTree的展开

   // If expand is true, expands all nodes in the tree.

   // Otherwise, collapses all nodes in the tree.

   public void expandAll(JTree tree, boolean expand) {

       TreeNode root = (TreeNode)tree.getModel().getRoot();

   

       // Traverse tree from root

       expandAll(tree, new TreePath(root), expand);

   }

   private void expandAll(JTree tree, TreePath parent, boolean expand) {

       // Traverse children

       TreeNode node = (TreeNode)parent.getLastPathComponent();

       if (node.getChildCount() >= 0) {

           for (Enumeration e=node.children(); e.hasMoreElements(); ) {

               TreeNode n = (TreeNode)e.nextElement();

               TreePath path = parent.pathByAddingChild(n);

               expandAll(tree, path, expand);

           }

       }

   

       // Expansion or collapse must be done bottom-up

       if (expand) {

           tree.expandPath(parent);

       } else {

           tree.collapsePath(parent);

       }

   }

10、如何遍历JTree

   // 创建树

   JTree tree = new JTree();

   

   // 添加树节点......

   

   // 遍历所有节点

   visitAllNodes(tree);

   

   // 仅遍历展开的节点

   visitAllExpandedNodes(tree);

   

   // Traverse all nodes in tree

   public void visitAllNodes(JTree tree) {

       TreeNode root = (TreeNode)tree.getModel().getRoot();

       visitAllNodes(root);

   }

   public void visitAllNodes(TreeNode node) {

       // node is visited exactly once

       process(node);

   

       if (node.getChildCount() >= 0) {

           for (Enumeration e=node.children(); e.hasMoreElements(); ) {

               TreeNode n = (TreeNode)e.nextElement();

               visitAllNodes(n);

           }

       }

   }

   

   // Traverse all expanded nodes in tree

   public void visitAllExpandedNodes(JTree tree) {

       TreeNode root = (TreeNode)tree.getModel().getRoot();

       visitAllExpandedNodes(tree, new TreePath(root));

   }

   public void visitAllExpandedNodes(JTree tree, TreePath parent) {

       // Return if node is not expanded

       if (!tree.isVisible(parent)) {

           return;

       }

   

       // node is visible and is visited exactly once

       TreeNode node = (TreeNode)parent.getLastPathComponent();

       process(node);

   

       // Visit all children

       if (node.getChildCount() >= 0) {

           for (Enumeration e=node.children(); e.hasMoreElements(); ) {

               TreeNode n = (TreeNode)e.nextElement();

               TreePath path = parent.pathByAddingChild(n);

               visitAllExpandedNodes(tree, path);

           }

       }

   }

转载自:http://www.blogjava.net/wangxinsh55/archive/2006/04/04/39219.html

JTree用法及JTree使用经验总结的更多相关文章

  1. JTree实现好友列表

    最近学习了一下JTree的使用方法: 先来看一下树的实例: 构建一个树, DefaultMutableTreeNode root = new DefaultMutableTreeNode(" ...

  2. JTree使用

    package JTree; import java.awt.Component; import javax.swing.Icon; import javax.swing.JTree; import ...

  3. Swing组件Jtree,JTablePane选项卡运用

    今天开始写技术博客,说实话,本没有什么技术,说是总结也好,说是分享也罢,总之是想自己有意识的做一些事情,作为一名即将毕业的大学生,总是想以最好的状态,去面向社会,今天就是我准备好了的时候,本人将技术博 ...

  4. JAVA GUI学习 - JTree树结构组件学习 ***

    public class JTreeKnow extends JFrame { public JTreeKnow() { this.setBounds(300, 100, 400, 500); thi ...

  5. JTree demo

    JFrame居中方法一:   setLocationRelativeTo(null); 注意:必须在整个frame初始化完成后再加上此语句,否则将显示在屏幕右下角 方法二: private Dimen ...

  6. Java Swing 树状组件JTree的使用方法(转)

    树中特定的节点可以由 TreePath(封装节点及其所有祖先的对象)标识,或由其显示行(其中显示区域中的每一行都显示一个节点)标识.展开 节点是一个非叶节点(由返回 false 的 TreeModel ...

  7. 详解Swing中JTree组件的功能

    JTree组件是另外一个复杂组件,它不像 JTable 那样难用,但是也不像 JList 那么容易.使用 JTree 时麻烦的部分是它要求的数据模型. JTree组件的功能来自树的概念,树有分支和叶子 ...

  8. java控件之树形结构JTree

    import javax.swing.JFrame; import javax.swing.JTree; import javax.swing.event.TreeSelectionEvent; im ...

  9. JTree常用方法

    private JTree jtNetDevice;//数组件申明private JScrollPane jspTree;//滚动面板申明 1.初始化     DefaultMutableTreeNo ...

随机推荐

  1. 查看Redis信息和状态

    原文转自:http://redisdoc.com/server/info.html INFO [section] 以一种易于解释(parse)且易于阅读的格式,返回关于 Redis 服务器的各种信息和 ...

  2. github Travis CI 持续集成

    一个项目如何保证代码质量是开发中非常重要的环节,对于开源项目来说更是如此,因为开源项目要面对的是来自不同水平开发者提交的代码.所以围绕开源做持续集成(Continuous Integration)变得 ...

  3. Linux中查看进程的多线程pstree, ps -L

    Linux中查看进程的多线程 在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况:在我的 ...

  4. 通过redis-rdb-tools分析redis内存使用量

    背景:生产上一台redis服务器,物理内存32G,几个项目都在用,经常不足一月内存就会耗尽,然后开始使用swap,当swap也用尽的时候,系统就宕机.redis配置也优化过几次,但未见成效.因此决定看 ...

  5. 【转】 为SeekBar滑块设置固定值以及自定义Seekbar,progressbar样式--不错

    原文网址:http://blog.csdn.net/jdsjlzx/article/details/7804080 最近在项目中使用到了seekbar和progressbar,且必须按照设计要求来进行 ...

  6. 【转】Android JNI编程—JNI基础

    原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...

  7. 数据结构(动态树):UOJ 207 共价大爷游长沙

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABHwAAAJZCAIAAABUW7XHAAAgAElEQVR4nOy93cstx5Xm2f9TXh2EOe

  8. Eucalyptus安装包的功能列表

    aoetools    是一个用来在以太网上运行 ATA 存储协议的软件,相当于一个网络存储功能.euca2ools  eucalpytus客户端杜昂管理工具axis2c       SOAP引擎,同 ...

  9. openresty nginx 安装过程记录

    转载请注明原始地址 http://www.cnblogs.com/dongxiao-yang/p/4877799.html 一 :系统版本 1 cat /etc/issue: CentOS relea ...

  10. 遭遇多线程bug (1)

    某些用户,机器重启后,到第三方服务器的连接起不来,而到我们自己服务器的连接就没事. 如果连接由于网络或其他原因fail掉,过一定时间后应该会重新尝试建立连接的. 测试组做初步调查,他们能在本地环境复现 ...