JTree控件的用法

 

 

 
 
JTree用法集荟(全部网上收集)
[ 2007-3-21 8:46:00 | By: kind ]
 
1。自动展开树,来源自 Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1531351

package testpicturejava;

import java.awt.*;

import javax.swing.*;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import java.util.Enumeration;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2007</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */
public class JTreeFrame extends JFrame {
    public JTreeFrame() {
        try {
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

    private void jbInit() throws Exception {
        getContentPane().setLayout(null);
        setSize(new Dimension(434, 347));
        setTitle("JTree Frame Title");
        jScrollPane1.setBounds(new Rectangle(9, 9, 429, 317));
        this.getContentPane().add(jScrollPane1);
        expandTree(jTree1);
        jScrollPane1.getViewport().add(jTree1);
    }

    /**     * 完全展开一个JTree     * @param tree JTree     */
    public static void expandTree(JTree tree) {
        TreeNode root = (TreeNode) tree.getModel().getRoot();
        expandAll(tree, new TreePath(root), true);
    }

    /**     * 完全展开或关闭一个树,用于递规执行     * @param tree JTree     * @param parent 父节点     * @param expand 为true则表示展开树,否则为关闭整棵树     */

    private static 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);
        }
    }

    JScrollPane jScrollPane1 = new JScrollPane();
    JTree jTree1 = new JTree();
}

2。用最简便的方法更换JTREE图标 来源自 http://www.35dx.com/html/java/1/java543.html

最近为一个程序写界面,需要更换JTree的默认图标,因为以前从没做过swing,走了不少弯路,现在把方法告诉大家,希望对你的工作能有所帮助.

     先来一个常见的图标更换方法,需要显示继承DefaultTreeCellRenderer类,代码引用自http://blog.blogchina.com/174500.html

private class MyRenderer extends DefaultTreeCellRenderer {
           ImageIcon htmlIcon;
           ImageIcon imageIcon;
           public MyRenderer() {
               htmlIcon = new ImageIcon("source/html.gif");
               imageIcon=new ImageIcon("source/image.gif");
           }

           public Component getTreeCellRendererComponent(
                               JTree tree,
                               Object value,
                               boolean sel,
                               boolean expanded,
                               boolean leaf,
                               int row,
                               boolean hasFocus) {

               super.getTreeCellRendererComponent(
                               tree, value, sel,
                               expanded, leaf, row,
                               hasFocus);
               if (leaf && isImage(value)) {
                   setIcon(imageIcon);
                   //setToolTipText("This book is in the Tutorial series.");
               }
               else if(leaf){
                   setIcon(htmlIcon);
               }

               return this;
           }

           protected boolean isImage(Object value) {
               Sitemarks.SitemarkEntry node =
                       (Sitemarks.SitemarkEntry)value;
               String name=
                       (String)(node.getName());

               if (name.endsWith(".jpg")||name.endsWith(".gif")) {
                   return true;
               }

               return false;
           }
       }

    实现起来太麻烦了,我只是想换个图标而已,java也太不讲人情了,需要写这么多代码.于是我尝试这样直接设置:

   JTree leftTree = new JTree();
   ((DefaultTreeCellRenderer)leftTree.getCellRenderer()).setClosedIcon(myClosedIcon);
   这样的问题是,如果你需要动态增删JTree的结点,调用UpdateUI()方法后,显示的图标又变为默认的图标.你还得在调用updateUI()后重新调用上面语句.

   最后我想到使用匿名类的方法如下:

           leftTree.setCellRenderer(new DefaultTreeCellRenderer(){
                 public Icon getClosedIcon() {
                         //返回你需要的图标
                         return myClosedIcon                                                                                                                                   

                 }
           });

 

3。JTree使用经验总结 来源自 Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=607847

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

4。JTree的事件监听 来源自 Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=623509

import javax.swing.tree.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;

使用流程:
1,JTree tree = createTree();//得到JTree对象,createTree()见文后

2,DefaultTreeCellRenderer render = new DefaultTreeCellRenderer();
  tagTree.setCellRenderer( render );//设置Tree的Render模式

3,thdTree.addTreeSelectionListener(
   new TreeSelectionListener()
   {
      public void valueChanged(TreeSelectionEvent e){

      }
   }
  );//增加选中节点的监听器

private void createTree()
{
    //一般构造方法
     JTree tree;
     DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
     DefaultTreeModel treeModel=new DefaultTreeModel(root);       
     root.setAllowsChildren(true);
     tree = new JTree(treeModel);

     DefaultTreeCellRenderer treeRender = new DefaultTreeCellRenderer();
     treeRender.setOpaque(true);
     tree.setCellRenderer(treeRender);
     ToolTipManager.sharedInstance().registerComponent(tree);
     tree.setName("tagTree");     
     return tree;
}

5。使用jdom操作xml数据,生成含Jtree的applet   来源自Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=120876

关键词:xml,jdom,applet,jtree


在我们工作中,常常会碰到树形组件的生成问题,如果你在开发web application,纯粹使用
javascript来生成树形组件是非常繁琐的,而且交互性也不不太好。所以许多产品使applet来实现树形组件的功能。比如说,weblogic,jboss等产品的console.所以,把树形数据组织成xml文件,用jdom剖析它,最后生成applet就非常有通用的意义。下面,我就给出一个例子,抛砖引玉。

1.准备一个存有属性数据的xml文件,把它放在classpath中,我这里是org.xml。

[pre]<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSPY v5 rel. 3 U (http://www.xmlspy.com)-->
<node xmlns="http://www.javabox.com/schemas/org" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xsi:schemaLocation="http://www.javabox.com/schemas/org
E:/myDemo/org.xsd" name="组织机构" id="-1" desc="" link="#">
    <node name="总经理" id="1" desc="" link="#">
        <node name="管理副总经理" id="2" desc="" link="#"/>
        <node name="生产副总经理" id="3" desc="" link="#">
            <node name="项目部" id="7" desc="" link="#"/>
            <node name="机械公司" id="8" desc="" link="#"/>
            <node name="贝盟公司" id="9" desc="" link="#"/>
            <node name="洛斯韦公司" id="9" desc="" link="#"/>
        </node>
        <node name="总工程师" id="4" desc="" link="#"/>
        <node name="总会计师" id="5" desc="" link="#"/>
        <node name="总经济师" id="6" desc="" link="#"/>
    </node>
</node>[/pre]

2.确保你可以使用jdom解析器,你如果没有可以去这里下载。

3.用于代表树结点节点的javabean,TreeNode.java

package com.javabox.jtree;

public class TreeNode{
  private String id;
  private String name;
  private String link;
  public TreeNode(String id,String name,String link){
    this.id=id;
    this.name=name;
    this.link=link;
  }
  public String getId(){
    return id;
  }
  public void setId(String Id){
    this.id=Id;
  }
  public void  setName(String Name){
    this.name=Name;
  }

  public String getName(){
    return name;
  }

  public String toString(){
    return  name;
  }
  public String getLink(){
    return link;
  }
  public void setLink(String link){
    this.link=link;
  }


}


4.自己写的TreeCellRenderer,IconRender.java

package com.javabox.jtree;

import javax.swing.*;
import java.awt.*;
import javax.swing.tree.*;

import javax.swing.tree.DefaultTreeCellRenderer;

class IconRender
    extends DefaultTreeCellRenderer {
  
//你需要替换成你的icon

  public static final Icon leafSelectedIcon = new ImageIcon("greeball.JPG");
  public static final Icon leafUnSelectedIcon = new ImageIcon("greyball.JPG");
  public static final Icon folderOpen = new ImageIcon("folderopen.JPG");
  public static final Icon folderClose = new ImageIcon("folderclose.JPG");
  public Component getTreeCellRendererComponent(JTree tree,
                                                Object value,
                                                boolean selected,
                                                boolean expanded,
                                                boolean leaf,
                                                int row,
                                                boolean hasFocus) {
    super.getTreeCellRendererComponent(tree, value, selected, expanded,
                                       leaf, row, hasFocus);

    if (leaf && selected) {
      setIcon(IconRender.leafSelectedIcon);
    }
    else if (leaf) {
      setIcon(IconRender.leafUnSelectedIcon);
    }

    return this;
  }

  public IconRender() {
    super();
    this.setLeafIcon(leafUnSelectedIcon);
    this.setOpenIcon(folderOpen);
    this.setClosedIcon(folderClose);

  }

}


5.AppletTree.java,该文件解析xml文件,生成含Jtree的applet,你可以把它嵌入到jsp,html文件中使用,也可以直接运行该文件。

package com.javabox.jtree;
import javax.swing.event.*;
import java.awt.*;
import java.applet.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.event.*;
import org.jdom.*;
import org.jdom.input.*;
import java.io.*;
import java.util.*;

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;
import javax.swing.plaf.metal.*;



import java.io.*;
import netscape.javascript.*;


public class AppletTree extends Applet implements TreeSelectionListener
{
  private JTree tree;

  private TreePath path;
  private Panel topPanel;
  private DefaultMutableTreeNode top;

  private DefaultMutableTreeNode clicknode;



  private String link;
  public AppletTree(){
  }

  public void init(){
    try{
    super.init();
    this.setLayout(new GridLayout(1,1));
    tree=createTree(new FileInputStream("org.xml"));
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    tree.putClientProperty("JTree.lineStyle","Angled");

    tree.setShowsRootHandles(true);
    tree.setEditable(false);
    tree.addTreeSelectionListener( this );
    IconRender render=new IconRender();
    tree.setCellRenderer(render);


    topPanel=new Panel(new BorderLayout());
    topPanel.add(tree);
    this.add(topPanel);
    }catch(Exception e){
      e.printStackTrace();
    }

  }
  public JTree createTree(InputStream is){
    SAXBuilder builder = new SAXBuilder();
    try {
      Document doc = builder.build(is);
      Element root=doc.getRootElement();
      TreeNode rootNode=new 

TreeNode(root.getAttributeValue("id"),root.getAttributeValue("name"),root.getAttributeValue("link"));
      top=new DefaultMutableTreeNode(rootNode);
      addNode(root,top);
    }  catch (Exception ex) {
      ex.printStackTrace();
    }
    //你可以在这里改变jtree中连线的颜色,我请教国外的高手才找到的,很酷的哦:)
    UIManager.put( "Tree.hash", new ColorUIResource(Color.red) );
    return new JTree(top);

  }

  /**
   *
   * @param e 待加入树种的jdom元素
   * @param rootNode 树根节点
   */


  private void addNode(Element e,DefaultMutableTreeNode rootNode){
    String id=e.getAttributeValue("id");
    String name=e.getAttributeValue("name");
    String link=e.getAttributeValue("link");
    TreeNode node=new TreeNode(id,name,link);
    //如有父节点
    Element father=e.getParent();
    if(father!=null){
      String fid=father.getAttributeValue("id");
      DefaultMutableTreeNode fatherNode=getTreeNode(fid,rootNode);
      if(fatherNode!=null){
        fatherNode.add(new DefaultMutableTreeNode(node));
      }
    }
    //如有子节点
    Iterator it=e.getChildren().iterator();
    while(it.hasNext()){
      Element child=(Element)it.next();
      addNode(child,rootNode);
    }

  }

  /**
   * 根据id,查找树节点,//广度优先
   * @param id 节点id
   * @param rootNode 树根节点
   * @return DefaultMutableTreeNode
   */

  private DefaultMutableTreeNode getTreeNode(String id,DefaultMutableTreeNode rootNode){
    DefaultMutableTreeNode returnNode=null;
    if(rootNode!=null){
      Enumeration enum=rootNode.breadthFirstEnumeration();
      while(enum.hasMoreElements()){
        DefaultMutableTreeNode temp=(DefaultMutableTreeNode)enum.nextElement();
        TreeNode node=(TreeNode)temp.getUserObject();
        if(node.getId().equals(id)){
          returnNode=temp;
          break;
        }
      }
    }
    return returnNode;

  }


  public void valueChanged( TreeSelectionEvent event ){
    if( event.getSource() == tree ){
      path = event.getPath();
      clicknode=(DefaultMutableTreeNode)path.getLastPathComponent();
      Object uo=clicknode.getUserObject();
      if(uo instanceof TreeNode){
        TreeNode nd=(TreeNode)clicknode.getUserObject();
        link=nd.getLink();
      }
      //调用一个javascript函数; 
//      JSObject.getWindow (this).eval ("javascript:window.open('"+link+"')") ;


    }
  }

  public static  void main(String[] args ){
    JFrame frame=new JFrame("test");
    AppletTree tree=new AppletTree();
    tree.init();
    frame.getContentPane().add(tree);
    frame.setSize(600,600);

    frame.show();
  }

}


6.运行一个这个类,是不是很cool哦,你还可以把它嵌在网页中,调用javasript函数,达到刷新页面的目的。


希望该文章能对你有所启发,祝你成功!

6。两个JTree之间的单向拖拽 来源自Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=18402

package aabbcc;

import javax.swing.JTree;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragSource;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.datatransfer.StringSelection;

/**
 * <p>Title: JTree之间的拖拽中的DragSourceTree</p>
 * <p>Description:通过向从“源树”中拖拽结点在目标树中重新构造一棵树,实现JTree之间的拖拽单向拖拽,这个类是“源树”。 </p>
 * @author awaysrain(绝对零度)
 * @version 1.0
 */

public class DragSourceTree
    extends JTree
    implements DragGestureListener, DragSourceListener {
  private DragSource dragSource = null;
  /**
   * Construct the source tree
   */
  public DragSourceTree() {
    super();
    dragSource = DragSource.getDefaultDragSource();
    dragSource.createDefaultDragGestureRecognizer(this,
                                                  java.awt.dnd.DnDConstants.
                                                  ACTION_COPY_OR_MOVE, this);
  }
  /**
   * Construct the source tree
   * @param treeNode DefaultMutableTreeNode
   */
  public DragSourceTree(DefaultMutableTreeNode treeNode) {
    super(treeNode);
    dragSource = DragSource.getDefaultDragSource();
    dragSource.createDefaultDragGestureRecognizer(this,
                                                  java.awt.dnd.DnDConstants.
                                                  ACTION_COPY_OR_MOVE, this);
  }

  /**
   * dragGestureRecognized
   *
   * @param dge DragGestureEvent
   */
  public void dragGestureRecognized(DragGestureEvent dge) {
    java.awt.Cursor cursor = null;
    cursor = DragSource.DefaultCopyDrop; //set cursor
    java.awt.Point jap = dge.getDragOrigin(); //drag point
    int x = (int) jap.getX();
    int y = (int) jap.getY();
    javax.swing.tree.TreePath tp = this.getPathForLocation(x, y); //get drag node path
    if (tp != null) {
      DefaultMutableTreeNode node1 = (DefaultMutableTreeNode)
          tp.getLastPathComponent(); //get drag node
      serializableNode(node1); //Serializable node object
    }
    //event start   
    dge.startDrag(cursor, new StringSelection("drag"), this);

  }

  /**
   * dragEnter
   *
   * @param dsde DragSourceDragEvent
   */
  public void dragEnter(DragSourceDragEvent dsde) {
  }

  /**
   * dragOver
   *
   * @param dsde DragSourceDragEvent
   */
  public void dragOver(DragSourceDragEvent dsde) {
  }

  /**
   * dropActionChanged
   *
   * @param dsde DragSourceDragEvent
   */
  public void dropActionChanged(DragSourceDragEvent dsde) {
  }

  /**
   * dragDropEnd
   *
   * @param dsde DragSourceDropEvent
   */
  public void dragDropEnd(DragSourceDropEvent dsde) {
  }

  /**
   * dragExit
   *
   * @param dse DragSourceEvent
   */
  public void dragExit(DragSourceEvent dse) {
  }
  /**
   *Serializable node 
   *
   * @param node DefaultMutableTreeNode
   */
  private void serializableNode(DefaultMutableTreeNode node) {
    try {
      java.io.FileOutputStream objfile = new java.io.FileOutputStream(
          "DragNode.OBJ");
      java.io.ObjectOutputStream p = new java.io.ObjectOutputStream(objfile);
      p.writeObject(node);
      p.flush();
      objfile.close();
    }
    catch (java.io.IOException e) {
      System.out.println(e.toString());
    }

  }
}

DragTargetTree.java



package aabbcc;

 

import javax.swing.JTree;
import java.awt.dnd.DropTargetListener;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTarget;
import java.io.*;
import java.io.*;
import javax.swing.tree.DefaultMutableTreeNode;

/**
 * <p>Title: JTree之间的拖拽中的DragTargetTree</p>
 * <p>Description:通过向从“源树”中拖拽结点在目标树中重新构造一棵树,实现JTree之间的拖拽单向拖拽,这个类是“目的树” </p>
 * @author awaysrain(绝对零度)
 * @version 1.0
 */

public class DragTargetTree
    extends JTree
    implements DropTargetListener {
  /**
   * Construct the target tree
   */
  public DragTargetTree() {
    super();
    DropTarget dropTarget = new DropTarget(this,
                                           java.awt.dnd.DnDConstants.
                                           ACTION_COPY_OR_MOVE, this);
  }
  /**
   *  Construct the target tree
   * @param treeNode DefaultMutableTreeNode
   */
  public DragTargetTree(DefaultMutableTreeNode treeNode) {
    super(treeNode);
    DropTarget dropTarget = new DropTarget(this,
                                           java.awt.dnd.DnDConstants.
                                           ACTION_COPY_OR_MOVE, this);
  }


  /**  
   * dragEnter
   *
   * @param dtde DropTargetDragEvent
   */
  public void dragEnter(DropTargetDragEvent dtde) {
  }

  /**
   * dragOver
   *
   * @param dtde DropTargetDragEvent
   */
  public void dragOver(DropTargetDragEvent dtde) {
  }

  /**
   * dropActionChanged
   *
   * @param dtde DropTargetDragEvent
   */
  public void dropActionChanged(DropTargetDragEvent dtde) {
  }

  /**
   * drop
   *
   * @param dtde DropTargetDropEvent
   */

  public void drop(DropTargetDropEvent dtde) {
    dtde.acceptDrop(java.awt.dnd.DnDConstants.ACTION_COPY); //accept drop
    java.awt.Point ap = dtde.getLocation(); // get event point
    int x = (int) ap.getX();
    int y = (int) ap.getY();
    javax.swing.tree.DefaultMutableTreeNode parnode;
    javax.swing.tree.TreePath tp = this.getPathForLocation(x, y);
    if (tp != null) {
        try {
        //get drop tree node with treepath
        javax.swing.tree.DefaultMutableTreeNode no1 =
            (javax.swing.tree.DefaultMutableTreeNode) tp.getLastPathComponent();
        parnode = no1;
        int index = parnode.getChildCount();
        // get drop tree mode
        javax.swing.tree.DefaultTreeModel tm =
            (javax.swing.tree.DefaultTreeModel)this.getModel();
        javax.swing.tree.DefaultMutableTreeNode node2 =
            new javax.swing.tree.DefaultMutableTreeNode();
        node2 = readNode();
        tm.insertNodeInto(node2, parnode, index);
      }
      catch (java.lang.Exception e) {
        System.out.println(e.toString());
      }
    }

  }

  /**
   * dragExit
   *
   * @param dte DropTargetEvent
   */

  public void dragExit(DropTargetEvent dte) {
  }

  /**
   *
   * read the node
   * @return DefaultMutableTreeNode
   */ 
  private DefaultMutableTreeNode readNode() {

    FileInputStream objfile = null;
    try {
      objfile = new java.io.FileInputStream("DragNode.OBJ");
      ObjectInputStream q = new ObjectInputStream(objfile);
      DefaultMutableTreeNode node = (DefaultMutableTreeNode) q.readObject();
      return node;
    }
    catch (Exception ex) {
      return null;
    }
  }
}

Demo.java



package aabbcc;

 

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import com.borland.jbcl.layout.*;

/**
 * <p>Title: JTree之间的拖拽测试</p>
 * <p>Description:通过向从“源树”中拖拽结点在目标树中重新构造一棵树,实现JTree之间的拖拽单向拖拽,这个类测试的类 </p>
 * @author awaysrain(绝对零度)
 */


public class Demo extends JFrame {
  JPanel contentPane;
  JScrollPane jScrollPane1 = new JScrollPane();
  XYLayout xYLayout1 = new XYLayout();
  DragSourceTree jTree1 = new DragSourceTree();
  JScrollPane jScrollPane2 = new JScrollPane();
  DragTargetTree jTree2 = new DragTargetTree();
  JLabel jLabel1 = new JLabel();
  JLabel jLabel2 = new JLabel();

  //Construct the frame
  public Demo () {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
 

 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值