package com.boomlink.design;

/**
* 树节点属性userObject的对象类
* @author 浪人
*
*/

public class TreeNodeObject{
   /**
    * 节点ID
    */

  String nodeId;    
   /**
    * 父辈ID
    */

  String parentId;    
   /**
    * 节点名称
    */

  String nodeName;    
   /**
    * 包含其他信息的对象
    */

  Object userObject;    
    
   /**
    * 返回树节点对象的显示名称
    */

   public String toString(){

     return nodeName;
  }
   /**
    * 返回树节点对象的主要信息
    * @return String
    */

   public String toString2(){
    String str = "[";
    str += "{节点ID:" + nodeId + "}";
    str += ",{父辈ID:" + parentId + "}";
    str += ",{节点名称:" + nodeName + "}";
    str += "]\n";
     return str;
  }
   public String getNodeId() {
     return nodeId;
  }
   public void setNodeId(String nodeId) {
     this.nodeId = nodeId;
  }
   public String getNodeName() {
     return nodeName;
  }
   public void setNodeName(String nodeName) {
     this.nodeName = nodeName;
  }
   public String getParentId() {
     return parentId;
  }
   public void setParentId(String parentId) {
     this.parentId = parentId;
  }
   public Object getUserObject() {
     return userObject;
  }
   public void setUserObject(Object userObject) {
     this.userObject = userObject;
  }
}
 
package com.boomlink.design;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.List;

import javax.swing.JOptionPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;

/**
* 用一个对象列表创建一颗树。
* @author 浪人
*
*/

public class MyTree {
   /**
    * 数据库驱动程序类名
    */

   static String classname = "oracle.jdbc.driver.OracleDriver";
   /**
    * 访问数据库URL
    */

   static String url = "jdbc:oracle:thin:@192.168.1.158:1521:saledb";
   /**
    * 数据库用户名
    */

   static String username = "SaleUser";
   /**
    * 数据库密码
    */

   static String password = "SaleUser";
   /**
    * 数据库连接
    */

   static Connection connection;
   /**
    * 加载数据库驱动程序类,创建一个数据库连接。
    */

   static {
     try{
      Class.forName(classname);
    } catch(ClassNotFoundException ex){
      ex.printStackTrace();
    }
     try {
      connection = DriverManager.getConnection(url, username, password);
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
   /**
    * 对象列表
    */

  List<TreeNodeObject> treeDataList;
   /**
    * JTree
    */

  JTree jtree;
   /**
    * 构造方法
    */

   public MyTree(){
    treeDataList = getTreeData();
    DefaultMutableTreeNode root = new DefaultMutableTreeNode();
    jtree = new JTree(root);
    addChildren(root, "root");
    addClickEvent(jtree);
  }
   /**
    * 给树节点添加孩子
    * @param node DefaultMutableTreeNode
    * @param nodeId String
    */

   public void addChildren(DefaultMutableTreeNode node, String nodeId){
     /* 递归为树节点添加孩子。将treeDataList中元素的父辈ID值等于参数nodeId值的元素对象创建一个树节点,并作为参数node的孩子。 */
    DefaultMutableTreeNode treeNode;
    TreeNodeObject tno;
    String curParentId;
    String curNodeId;
     for( int i = 0; i < treeDataList.size(); i++){
      tno = treeDataList.get(i);
      curParentId = tno.getParentId();
      curNodeId =tno.getNodeId();
       if(!curParentId.equals(nodeId)) continue;
      treeNode = new DefaultMutableTreeNode();
      treeNode.setUserObject(tno);
      node.add(treeNode);
      jtree.updateUI();
      addChildren(treeNode, curNodeId);
    }
  }
   /**
    * 给JTree添加鼠标事件
    * @param jtree JTree
    */

   public void addClickEvent( final JTree jtree){
    jtree.addMouseListener( new MouseListener(){
       public void mouseClicked(MouseEvent e) {
         /* 当鼠标双击事件被触发时,调用alert方法显示树节点的userObject值。 */
         int row = jtree.getRowForLocation(e.getX(), e.getY());
         if(row == -1) return;
         if(e.getClickCount() == 1) return;
        DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)jtree.getLastSelectedPathComponent();
        TreeNodeObject tno = (TreeNodeObject)treeNode.getUserObject();
        alert(tno.toString2());
      }
       public void mouseEntered(MouseEvent e) {}
       public void mouseExited(MouseEvent e) {}
       public void mousePressed(MouseEvent e) {}
       public void mouseReleased(MouseEvent e) {}
    });
  }
   /**
    * 在消息对话框中显示信息
    * @param msg String
    */

   public void alert(String msg) {
    JOptionPane.showMessageDialog( null, msg, "提示",  JOptionPane.INFORMATION_MESSAGE);
  }
   /**
    * Get JTree
    * @return JTree
    */

   public JTree getJTree(){
     return jtree;
  }
   /**
    * 从数据库中获取数据存储在TreeNodeObject类的对象列表中
    * @return List
    */

   public List<TreeNodeObject> getTreeData(){
    List<TreeNodeObject> list = new LinkedList<TreeNodeObject>();
    TreeNodeObject tno;
    String sql = "select * from userprivilege t where userid = '14'";
    Connection conn = connection;
     try{
      Statement stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery(sql);
       while(rs.next()){
        tno = new TreeNodeObject();
        tno.setNodeId(rs.getString( "MODELID"));
        tno.setParentId(rs.getString( "PARENTID"));
        tno.setNodeName(rs.getString( "MODELNAME"));
        list.add(tno);
      }
      rs.close();
      stmt.close();
    } catch(SQLException e){
      e.printStackTrace();
    }
     return list;
  }
   /**
    * 入口方法
    * @param args String[]
    */

   public static void main(String[] args){
     new MyTree();
  }
}
 
MyTree使用:
    jtree = new MyTree().getJTree();
    jp.setLayout( new BorderLayout());
    jp.add( new JScrollPane(jtree));
 
展示界面见附件。