`
夜乡晨
  • 浏览: 36243 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

转 JTree使用详解

阅读更多
JTree使用详解

在实际开发过程中会经常使用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);
           }
       }
   }

JTree从数据库直接取记录!我 是菜鸟!大家看看有什么问题QQ:6377149!

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import java.sql.*;
import java.io.*;
import java.util.*;

 

////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
class Console
{

   public static String title(Object o)
    {
      String t=o.getClass().toString();
      if(t.indexOf("class") != -1)
        t=t.substring(6);
        return t;
    }

public static void setupClosing(JFrame frame)
   {
    frame.addWindowListener(new WindowAdapter()
       {
        public void windowClosing(WindowEvent e)
          {
           System.exit(0);
          }
    });
}

public static void run(JFrame frame,int width,int height)
   {
    setupClosing(frame);
    frame.setSize(width,height);
    frame.setVisible(true);
   }

public static void run(JApplet applet,int width,int height)
{
   JFrame frame=new JFrame(title(applet));
   setupClosing(frame);
   frame.getContentPane().add(applet);
   frame.setSize(width,height);
   applet.init();
   applet.start();
   frame.setVisible(true);
}

public static void run(JPanel panel,int width,int height)
{
   JFrame frame=new JFrame(title(panel));
   setupClosing(frame);
   frame.getContentPane().add(panel);
   frame.setSize(width,height);
   frame.setVisible(true);
   }
}
///////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

//================================================
class MytreeNode extends DefaultMutableTreeNode
    {
       String mydata,mylable;

    MytreeNode(String ss)
         {
          super(ss);
         }
   
    public void setMydata(String s_mydata)
         {
          mydata=s_mydata;
         }
    public String getMydata()
         {
          return mydata;
         }
    public void setMylable(String s_mydata)
         {
          mylable=s_mydata;
         }
    public String getMylable()
         {
          return mylable;
         }
     }
//===============================================

public class Trees_test extends JApplet implements TreeModelListener
{
JTree tree;
public void init()
      {
       String url="jdbc:odbc:ypower";
       String user="ypower";
       String pass="ypower";
       String table="lineway";
       String index="id";
       String parent="parentid";
       String lable="simname";
       cjqTree ttt=new cjqTree(url,user,pass,table,index,parent,lable);
       try
          {
           tree=(JTree)ttt.getTree();
          }catch(ClassNotFoundException e){System.out.println("加载数据库驱动程序的时候出了错误!");}
           catch(InstantiationException e){System.out.println("InstantiationException");}
           catch(IllegalAccessException e){System.out.println("IllegalAccessException");}
           catch(SQLException e){System.out.println("SQLException");System.exit(0);}
       //树可以滚动
       Container cp=getContentPane();
       cp.add(new JScrollPane(tree),BorderLayout.CENTER);
     }
public static void main(String[] args)
    {
     Console.run(new Trees_test(),500,500);
    }
////////////////////////////////////////////////////////////////////////////////////////
//实现TreeModelListener提供的接口///////////////////////////////////////////////////////
//Void treeNodesChanged(TreeModelEvent e):当节点改变时系统就会云调用这个方法。/////////
//Void treeNodesInserted(TreeModelEvent e):当新增节时系统就会去调用这个方法。//////////
//Void treeNodesRemoved(TreeModeEvent e):当删除节点时系统就会去调用这个方法。//////////
//Void treeStructureChanged(TreeModelEvent e):当树结构改变时系统就会去调用这个方法。///
////////////////////////////////////////////////////////////////////////////////////////
public void treeNodesInserted(TreeModelEvent e)
    {//当增加新节点的时候返回当前节点的所有的子节点
     }
public void treeNodesChanged(TreeModelEvent e)
    {
     }
public void treeNodesRemoved(TreeModelEvent e)
    {
    }
public void treeStructureChanged(TreeModelEvent e)
    {
     }
/////////////////////////////////////////////////////////////////////////////////////////
//TreeModelEvent方法:                                                          /////////
//int[]                getChildIndices():返回子节点群的索引值。                 /////////
//Object[]             getChildren():返回子节点群.                               ////////
//Object[]             getPath():返回Tree中一条path上(从root nod到leaf node)的节点。/////
//TreePath             getTreePath():取得目前位置的Tree Path.                       /////
//String               toString():取得蝗字符串表示法.                              /////
/////////////////////////////////////////////////////////////////////////////////////////
}
//====================================================================
class cjqTree
    {
     private
            JTree mytree;
            DefaultTreeModel mymodel;
            Connection conn;
            Statement myst;
            String mysql;
            ResultSet myresult;
            String myurl,myuser,mypass,mytable,myindex,myparent,mylable;
     cjqTree(String url,String user,String pass,String table,String index,String parent,String lable)
            {
             myurl=url;
             myuser=user;
             mypass=pass;
             mytable=table;
             myindex =index;
             myparent=parent;
             mylable=lable;
           }
     public JTree getTree() throws ClassNotFoundException,
                                   InstantiationException,
                                   IllegalAccessException,
                                   SQLException
                                  
           {
             try{
                 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(ClassNotFoundException e){System.out.println("加载驱动的时候出了错误");System.exit(0);}
             conn=DriverManager.getConnection(myurl,myuser,mypass);
             //myst=conn.createStatement();
             myst= conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
             //mysql="select id,simname,name from lineway where parentid='AAAA'";
             mysql="Select "+ mylable+","+myindex +" from "+mytable +" where "+myparent+"='AAAA'";
             myresult=myst.executeQuery(mysql);
             myresult.next();
             String lable_this=myresult.getString(mylable);
             MytreeNode root=new MytreeNode(lable_this);
             root.setMylable(lable_this);
             root.setMydata(myresult.getString(myindex));
             mytree=new JTree(root);
             mymodel=(DefaultTreeModel)mytree.getModel();
             insertNodes(root);
             return mytree;
           }
    private void insertNodes(MytreeNode node) throws SQLException
           {
            String node_data;
            int rcount;
            node_data=node.getMydata();
            mysql="select "+mylable+","+myindex +" from "+mytable+" where "+myparent+"='"+node_data+"' order by "+myindex+" asc";
            myresult=myst.executeQuery(mysql);
            System.out.println("获取查询结果数之前!");
            //向当前的节点插入查询结果
            System.out.println(mysql);
            rcount=getResultCount(myresult);
           System.out.println("获取查询结果数之后!");
            if (rcount > 1)//如果当前有子节点的话就把它插入
                 {
                   MytreeNode[] children = new MytreeNode[rcount];
                   for(int j = 0;j<rcount;j++)
                       {
                        MytreeNode node_new=new MytreeNode(myresult.getString(myindex)+"-"+myresult.getString(mylable));
                        node_new.setMylable(myresult.getString(mylable));
                        node_new.setMydata(myresult.getString(myindex));
                        children[j]=node_new;//保存当前插入的子节点
                        mymodel.insertNodeInto(node_new,node,node.getChildCount());
                        myresult.next();
                       }
                   System.out.println("已经插入当前的查询结果!!");
                 //如果当前点有子节点则调用insertNodes()直到把所有的对象都插入进去
                    for(int j = 0;j<rcount;j++)
                       {
                        insertNodes(children[j]);
                        }
                   System.out.println("已经插入所有的查询结果!!");
                 }
           
           }
    private int getResultCount(ResultSet result) throws SQLException//获取查询结果树并把记录移动到第一条记录
            {
             int i = 0;
             while(result.next())
              {
              i++;
              }
              System.out.println("已经获取查询结果数:"+i);
              try{
                  result.first();
                  }catch(SQLException e){System.out.println("指针移不到第一条记录!");}
              return i;
            }
     }
//====================================================================

////////////
//DefaultMutableTreeNode:树的节点
//              r=new DefaultMutableTreeNode("Lable")
//              r.add(new DefaultMutableTreeNode("Lable2")
//DefaultTreeModel model;
//              model=(DefaultTreeModel)tree.getModel();
//              model.insertNodeInto(child,chosen,0)//插入并自动更新界面
//Jtree tree;
//              tree=new Jtree(toot);
//              chosen=(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();//返回当前选取的节点对象
//返回当前展开的节点和将要展开的节点 如何展开一个节点。
//

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics