JTree用法及JTree使用经验总结

来源:互联网 发布:stm32用串口4发送数据 编辑:程序博客网 时间:2024/05/16 11:45
JTree用法及JTree使用经验总结
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 (
 new  Dimension ( 700  400 ));
  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);
           }
       }
   }


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 7岁儿童叛逆期怎么办 被忽视型幼儿该怎么办 言语发育障碍脑神经损伤怎么办 5岁幼儿胆子小怎么办 幼儿20天胆子小怎么办 两岁宝宝胆子小怎么办 两岁的宝宝胆子小怎么办 孕中期发烧38度怎么办 小班社会交往教案有垃圾怎么办 两个月婴幼儿哭闹入睡难怎么办 8岁儿童睡觉困难怎么办 做精细动作手抖怎么办 15个月宝宝缺锌怎么办 八个月宝宝有蛔虫怎么办 两个月婴儿缺锌怎么办 婴儿天热出汗多尿少怎么办 婴儿5个月不主动抓东西怎么办 打疫苗吃了辣怎么办 四个月宝宝枕秃怎么办 四个月的孩子缺钙怎么办 小孩张牙齿会发烧怎么办 对节白蜡叶子干了怎么办 刷机字库坏了怎么办 魅蓝返回键失灵怎么办 牙蛀严重且牙根松动怎么办 蛀牙伤到神经了怎么办 给客户发错邮件怎么办外贸 cf没有枪声和脚步声怎么办 穿越火线fps太低怎么办 win10玩cf没有声音怎么办 儿子死了欠的钱怎么办 儿子欠银行的钱怎么办 惹了社会上的混混怎么办 我是五年级惹上混混怎么办 孩子挨欺负家长怎么办幼儿园 孩子被同学欺负不敢上学怎么办 孩子被欺负不敢还手怎么办 2个月的婴儿内热怎么办 孩子把别人打了怎么办 学生在学校被打怎么办 妈和老丈人搞外遇怎么办?