`
夜乡晨
  • 浏览: 37429 次
  • 性别: 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();//返回当前选取的节点对象
//返回当前展开的节点和将要展开的节点 如何展开一个节点。
//

分享到:
评论

相关推荐

    如何使用JTree,JTree使用方法

    ### 如何使用JTree:详解与实践 #### JTree简介 `JTree`是Java Swing中的一个组件,用于展示层次化的数据结构。它允许用户在应用程序中构建树形视图来表示目录结构、组织结构图等。`JTree`继承自`JComponent`类,...

    java组件之jtree使用

    ### Java组件之JTree使用详解 #### 一、引言 `JTree`是Java Swing中的一个重要组件,用于展示层次化的数据结构。它提供了一种直观的方式来表示具有层级关系的数据,例如文件系统的目录结构或者组织架构等。本文将...

    JTree用法大全 swing java

    ### JTree用法详解:Swing中的树状结构控件 在Java Swing中,`JTree`是一个非常重要的组件,用于展示层次结构的数据,如文件系统、组织结构图等。本文将详细介绍`JTree`的各种使用方法,包括如何创建、自定义外观、...

    jtree的详细使用说明

    ### JTree 的详细使用说明 #### 一、JTree 概述 `JTree` 是 Java Swing 中用于显示树状结构的数据组件。它继承自 `JComponent` 类,并且实现了 `Scrollable` 接口,这使得 `JTree` 能够在滚动面板 (`JScrollPane`)...

    JTree组件资料

    **JTree组件详解** 在Java Swing库中,`JTree`是一个重要的图形用户界面(GUI)组件,用于显示数据的树形结构。它允许用户通过展开和折叠节点来查看和操作层次化的信息。`JTree`是Java Swing的模型-视图-控制器...

    JTree的Doc文档

    **JTree的Doc文档详解** Java Swing库中的`JTree`组件是用于显示和操作树状数据结构的可视化工具。这个组件允许用户以图形化的方式查看层次化的信息,如文件系统目录、数据库结构或者应用程序的对象模型。在Java...

    JTree的用法

    ### JTree的用法详解 #### 一、引言 `JTree` 是 Java Swing 库中的一个重要组件,用于在图形用户界面 (GUI) 中显示层次结构数据。它非常适合用来展示具有分层关系的信息,例如文件系统目录结构、组织结构等。 ####...

    Login_Java.rar_The Given_jtree

    《Java中的JTree组件详解与应用》 在Java编程领域,GUI(图形用户界面)设计是不可或缺的一部分,其中Swing库提供了丰富的组件用于构建交互式的用户界面。在这些组件中,JTree是一个非常实用的控件,它允许用户以...

    ACCP体系(JTree)

    **ACCP体系与JTree详解** ACCP(Accelerated Career Certification Program)是一种针对信息技术领域的职业认证体系,旨在快速提升学员的技能,使他们能够胜任IT行业的相关职位。在这个体系中,JTree是一个重要的...

    swing界面设计之JTree

    #### (三) 对JTree从创建到使用详解 **初始化**:初始化JTree控件时,需要提供一个TreeModel来定义树的结构。 - **三个经常使用的取值函数**:获取树节点的信息,如`getRoot()`获取根节点。 - **根据node得到path**...

    JTree2.0 目录树demo源码

    **JTree2.0 目录树Demo源码详解** `JTree` 是Java Swing库中的一个组件,用于展示层次结构的数据,常被用来构建文件系统或者数据库对象的图形化界面。在`JTree2.0`这个版本中,开发者可能引入了新的特性和优化,以...

    Java+Swing图形界面开发与案例详解》实例代码

    在"Java+Swing图形界面开发与案例详解"这本书中,作者深入浅出地介绍了如何使用Swing来设计和实现GUI应用。 该书的实例代码包含了从第一讲到第八讲的源码,逐步引导读者从基础到进阶掌握Swing的使用。以下是这些讲...

    instrument/JTree-开源

    **Java JTree组件详解与Instrument/JTree开源库的深度解析** 在Java的Swing图形用户界面(GUI)库中,JTree是一个强大的组件,用于显示数据的层次结构。它允许用户通过节点和子节点的形式来浏览和操作数据,通常...

    Java Swing图形界面开发与案例详解_带书签_高清完整版

    5. **高级组件**:除了基础组件,Swing还提供了如JTable、JTree和JTabbedPane等高级组件,用于数据展示和多面板操作。这些组件的使用方法和自定义策略也是学习的重点。 6. **对话框和菜单**:Swing提供了内置的...

    Java Swing图形界面开发与案例详解及随书实例代码

    这些组件可以组合使用,创建出复杂的交互式界面。 Swing提供了模型-视图-控制器(MVC)架构,这意味着组件的行为和外观是分离的。例如,JButton有一个ActionListener接口,你可以实现这个接口来处理按钮被点击的...

    Java Swing图形界面开发与案例详解

    8. 树形视图:JTree组件的创建和数据模型的绑定。 9. 滚动面板:如何将组件放入JScrollPane中实现滚动功能。 10. 自定义组件:如何扩展Swing组件以实现个性化功能。 11. 图形绘制:使用Graphics2D进行高级图形绘制。...

    《Java Swing图形界面开发与案例详解》源代码

    本资源——"《Java Swing图形界面开发与案例详解》源代码",显然是一个详细教程的配套源码,旨在帮助学习者深入理解和实践Swing的相关知识。 Swing组件库包含了窗口、按钮、文本框、滚动面板、菜单、表格、树形视图...

    Java Swing图形界面开发与案例详解 .王鹏等.扫描版(前5章代码)

    在"Java Swing图形界面开发与案例详解 .王鹏等.扫描版(前5章代码)"中,读者可以学习到以下关键知识点: 1. **基础组件**:包括JButton、JLabel、JTextField、JTextArea、JComboBox、JCheckBox、JRadioButton等基本...

    Java+Swing图形界面开发与案例详解pdf+源码

    10. **综合案例**: 资源中包含的综合例子程序可能涵盖了Swing的多个方面,从基础组件的使用到复杂布局的实现,再到事件处理和数据展示,这有助于读者更好地理解和掌握Swing的实战应用。 通过深入学习本资源,无论是...

Global site tag (gtag.js) - Google Analytics