Java JTree的用法

来源:互联网 发布:医学三维重建软件 编辑:程序博客网 时间:2024/06/10 01:19

这是好几天前找的代码了,一直没有看,今天翻出来,觉得写得很不错,就自己摘抄在这里了。

原谅我已经不知道原文出处了,抱歉!各位有知道的,望转告,谢谢~

package lj.hp.test4;import javax.swing.*;import java.awt.Color;import java.awt.Component;import java.awt.Container;import java.awt.event.*;import javax.swing.tree.DefaultMutableTreeNode;import javax.swing.tree.DefaultTreeModel;import javax.swing.tree.TreeCellRenderer;import java.util.Random;import java.awt.event.MouseAdapter;import java.util.Vector;import java.util.Hashtable;import java.util.Enumeration;import javax.swing.tree.TreePath;import java.sql.ResultSet;public class GB extends JFrame{  private TreeMenu tree;  public GB() {    tree = new TreeMenu();    this.setSize(500,550);    this.Init();    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    this.show();  }  private void Init()  {    Container cp = this.getContentPane();    cp.setLayout(null);    JScrollPane jsp = new JScrollPane(tree);    jsp.setBounds(100,20,300,500);    cp.add(jsp);  }  public static void main(String[] args) {    GB gb = new GB();  }}class TreeMenu extends JTree{  private DefaultMutableTreeNode root;  private DefaultTreeModel model;  public TreeMenu()  {    super();    this.setRootVisible(true);    NodeData rootData = new NodeData("Root");    root = new DefaultMutableTreeNode(rootData);    model = new DefaultTreeModel(root);    model.setRoot(root);    this.setModel(model);    this.addMouseListener(new LinktoEvent());    this.setCellRenderer(new CellRender());    this.testLoaddata();  }   private void testLoaddata()  {    Hashtable table = new Hashtable();    long seeds = java.util.Calendar.getInstance().getTimeInMillis();    for(int i = 0 ; i < 10 ; i ++)    {      Random r = new Random(seeds);      NodeData nd = new NodeData(String.valueOf(r.nextInt(1000)));      seeds += r.nextInt(1000);      Vector vec = new Vector();      for(int j = 0 ; j < 3 ; j++)      {        double min = r.nextDouble();        seeds += min;        double max = r.nextDouble();        seeds += max;        double value = r.nextDouble();        seeds += value;        vec.addElement(new NodeData(min,max,value,"www.csdn.NET"));      }      table.put(nd,vec);    }    this.LoadData(table);  }     public void LoadData(Hashtable nodes)  {    Vector child;    Vector parent = new Vector();    java.util.Enumeration enum2 = nodes.keys();    while(enum2.hasMoreElements())    {      parent.addElement(enum2.nextElement());    }    for(int i = parent.size() - 1 ; i > 0 ; i--)    {      child = (Vector) nodes.get(parent.elementAt(i));      DefaultMutableTreeNode temp = this.addParentNode(                                        (NodeData)parent.elementAt(i));      DefaultMutableTreeNode parentNode =          this.addParentNode(temp,new NodeData("Three"));      for(int j = 0 ; j < child.size() ; j++)      {        this.addChildNode(parentNode,(NodeData) child.elementAt(j));      }    }  }     public DefaultMutableTreeNode addParentNode(NodeData nodeData)  {    DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(nodeData);    ((DefaultMutableTreeNode) model.getRoot()).add(newNode);    return newNode;  }    public DefaultMutableTreeNode addParentNode(DefaultMutableTreeNode parentNode,                                              NodeData nodeData)  {    DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(nodeData);    parentNode.add(newNode);    return newNode;  }     public void addChildNode(DefaultMutableTreeNode node,NodeData nodeData)  {    DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(nodeData);    node.add(childNode);  }    public void reBuild()  {    root.removeAllChildren();    this.testLoaddata();  }    class LinktoEvent extends MouseAdapter  {    public void mouseClicked(MouseEvent me)    {      DefaultMutableTreeNode node;      TreePath selectedPath = TreeMenu.this.getPathForLocation(me.getX(),me.getY());      if(selectedPath !=null )      {        node = (DefaultMutableTreeNode)            selectedPath.getLastPathComponent();        if (node != null && node.isLeaf()) {          NodeData nd = (NodeData) node.getUserObject();          //The leaf that has url will be display a dialog.          if(nd.isLeaf())          {            JOptionPane.showConfirmDialog(TreeMenu.this, nd.getUrl());            //You can implment your function.          }        }      }    }  }}  class NodeData{  private String name;  private double min;  private double max;  private double value;  private boolean isLeaf = false;  private String url = null;    public NodeData(String name)  {    this.name = name ;    this.isLeaf = false;  }    public NodeData(double min,double max,double value,String url)  {    this.min = min ;    this.max = max ;    this.value = value;    this.isLeaf = true;    this.url = url;  }    public boolean isLeaf()  {    return this.isLeaf ;  }    public boolean isOverflow()  {    if(this.isLeaf == true)    {      if(value <= max && value >= min)      {        return true ;      }      else      {          return false;      }    }    else    {        return false;    }  }     public String toString()  {    if(this.isLeaf())    {      return String.valueOf(value);    }    else    {      return this.name;    }  }    public void setUrl(String newUrl)  {    this.url = newUrl;  }  public String getUrl()  {    return this.url;  }}  class CellRender extends JLabel    implements TreeCellRenderer {  protected Color selectedBackground;  protected Color selectedForeground;  protected Color noselectedBackground;  protected Color noselectedForeground;  protected Color overflowBackground = Color.yellow;  protected Color overflowForeground = Color.red;  protected Color overflowSelectedBG = Color.green;  protected Color overflowSelectedFG = Color.black;  public CellRender()  {    super();    this.selectedBackground = Color.blue;    this.selectedForeground = Color.green;    this.noselectedBackground = Color.white;    this.noselectedForeground = Color.blue;    this.setForeground(this.noselectedForeground);    this.setBackground(this.noselectedBackground);  }   public Component getTreeCellRendererComponent(JTree tree, Object value,                                                boolean selected,                                                boolean expanded, boolean leaf,                                                int row, boolean hasFocus) {    DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;    NodeData nd ;       if(leaf)      {          nd = (NodeData) node.getUserObject();      }      else      {          nd = checkChild(node);      }      if (!nd.isOverflow()) {          if (selected)          {            this.setForeground(this.selectedForeground);            this.setBackground(this.selectedBackground);          }          else          {            this.setBackground(this.noselectedBackground);            this.setForeground(this.noselectedForeground);          }        }        else {          if(selected)          {            this.setBackground(this.overflowSelectedBG);            this.setForeground(this.overflowSelectedFG);          }          else          {            this.setBackground(this.overflowBackground);            this.setForeground(this.overflowForeground);          }        }       this.setText(value.toString());    return this;  }  private NodeData checkChild(DefaultMutableTreeNode childNode)  {    NodeData child = null;    int count = childNode.getChildCount();    for(int i = 0 ; i < count ; i++)    {      DefaultMutableTreeNode childNodes =          (DefaultMutableTreeNode) childNode.getChildAt(i);      if(childNodes.isLeaf())      {        child = (NodeData) childNodes.getUserObject();        if(child.isOverflow())        {          break;        }      }      else      {          child = checkChild(childNodes);      }    }    return child;  } }



运行结果如下图所示:


再次感谢原文作者~

2017.04.22

大周六的还在实验室学习~今天北京蓝天,微风,天气晴朗~适宜出门~


0 0