posts - 496,comments - 227,trackbacks - 0
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);
           }
       }
   }


posted on 2006-04-04 17:24 simone 阅读(46088) 评论(5)     所属分类: java

feedback:
# re: jtree用法及jtree使用经验总结
2008-05-12 16:40 |
不错,顶~  回复  
  
# re: jtree用法及jtree使用经验总结
2011-07-06 09:32 |
博主感谢你!  回复  
  
# re: jtree用法及jtree使用经验总结
2012-02-25 15:17 |
顶啊!我们课程设计要做个模拟文件管理,我想用jtree,但是还没有什么思路,能指点一下么?大侠!  回复  
  
# re: jtree用法及jtree使用经验总结[未登录]
2013-03-16 16:00 |
谢谢!好系统啊!  回复  
  
# re: jtree用法及jtree使用经验总结
2013-05-26 19:03 |
感谢,感谢  回复  
  
"));
网站地图