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. 禁用窗体关闭按钮(使用GetWindowLong修改GWL_STYLE)

    一般我们不想让窗体能够关闭, 首先想到的是在OnCloseQuery事件里设置CanClose := False, 不过在某些情况下这个会和程序关闭窗体的业务逻辑产生冲突 所以写了下面这个函数, 可以 ...

  2. 使用SSH代理上IPV6(使用SSH端口转发)

    这几个月在国外待着,一直担心我的六维账户怎么办,那可是个宝贝啊.我看网上说可以用六飞啊神马的在IPV6下上IPV6的网站,但是冒失现在六维封禁了非学校的IPV6地址,所以这些软件就不顶用了. 想到以前 ...

  3. finalize与System.gc()

    finalize Finalize是Object类的一个方法,可以用来被重写 finalize的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只 ...

  4. GitHub的5人骨干小组:早期初创公司该如何招到正确的人

    转自:http://news.cnblogs.com/n/190924/ 前 5 年对初创公司来说至关重要,根据美国中小企业发展署的数据,大约 1/4 的初创公司在第一年内关门大吉,只有不到一半的企业 ...

  5. 图论(网络流):SCOI 2007 修车

    同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最小 ...

  6. Majority Element II——LeetCode

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...

  7. [Locked] Find the Celebrity

    Find the Celebrity Suppose you are at a party with n people (labeled from 0 to n - 1) and among them ...

  8. M - 昂贵的聘礼 - poj1062

    Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...

  9. (组合数学3.1.1.2)UVA 10098 Generating Fast(使用字典序思想产生所有序列)

    /* * UVA_10098.cpp * * Created on: 2013年10月8日 * Author: Administrator */ #include <iostream> # ...

  10. AE 3D摄像机工作原理

    看了AE教程的3D可视化音频和序列法导入三维模型之后对于视频解析3D是有了更深的认识.很感谢AE在CS6之后加入了3D摄像机跟踪器的功能.它是通过摄像机跟踪反求来得到影片中的平面特征点.然后由用户指定 ...