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. MFC任务管理器task manager----进程的挂起与恢复--NtSuspendProcess&&NtResumeProcess

    http://hi.baidu.com/xbbsh/blog/item/b73d3125462201084c088db1.html ---------------------------------- ...

  2. 把消息送到默认窗口函数里,并非一点用都没有,可能会产生新的消息(以WM_WINDOWPOSCHANGED为例)

    我在追踪执行: procedure TForm1.Button1Click(Sender: TObject); begin panel1.Left:=panel1.Left-; end; 并且屏蔽TW ...

  3. Caption,Text,WindowText的区别——TControl也有FText,是为了模拟一个窗口

    TControl = class(TComponent) // 控件的Windows功能从TControl开始 property Caption: TCaption read GetText writ ...

  4. J2EE和EJB有什么关系?

    其实j2EE就是java的企业版,与javaSE(标准版)有是有区别的,所以运行环境会有差异(简单点可以说,这是两组不同的接口),我们一般所熟悉的tomcat仅仅只实现了j2ee的一小部分规范,它只是 ...

  5. Java Random

    第一种情况 Random rand = new Random(47); for(int i=0;i<10;i++) System.out.println(rand.nextInt(100)); ...

  6. 掌握 Linux 调试技术

    掌握 Linux 调试技术 在 Linux 上找出并解决程序错误的主要方法 Steve Best (sbest@us.ibm.com)JFS 核心小组成员,IBM 简介: 您可以用各种方法来监控运行着 ...

  7. Pie(二分)

    ime Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8930   Accepted: 3235   Special Judge De ...

  8. BZOJ 1054 [HAOI2008]移动玩具

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1388  Solved: 764[Submit][Statu ...

  9. kvm编译安装及常见问题解决

    一.KVM的编译安装 1.安装基本系统和开发工具 1.1 编译内核 mkdir /root/kvm cd /root/kvm wget http://www.kernel.org/pub/linux/ ...

  10. JVM垃圾回收机制入门

    前言 数据库是大家会普遍重视的一个领域,异步通信一般用不到,虚拟机在大部分时候不会出问题,常被人忽视,所以我打算先学习虚拟机,从零单排Java高性能问题. 堆内存存储结构 Java6是以年代来规划内存 ...