参考了一个从源树到目的树托拽的代码:
因为我的两个树都是读xml生成的。
所以我想在源树节点托到目的树的时候。
目的树的xml文件也跟着变化。
请问怎么修改?
DragSourceTree.java
---------------------------------------------------------------------------
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());
    }  }
}

解决方案 »

  1.   


    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 static void main() {
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
        try {
          jbInit();
        }
        catch(Exception e) {
          e.printStackTrace();
        }
      }  //Component initialization
      private void jbInit() throws Exception  {
        contentPane = (JPanel) this.getContentPane();
        contentPane.setLayout(xYLayout1);
        this.setSize(new Dimension(400, 300));
        this.setTitle("Demo");
        jLabel1.setFont(new java.awt.Font("DialogInput", 0, 16));
        jLabel1.setText("源树");
        jLabel2.setEnabled(true);
        jLabel2.setFont(new java.awt.Font("DialogInput", 0, 16));
        jLabel2.setDebugGraphicsOptions(0);
        jLabel2.setDoubleBuffered(false);
        jLabel2.setVerifyInputWhenFocusTarget(true);
        jLabel2.setDisplayedMnemonic('0');
        jLabel2.setText("目标树");
        jLabel2.setVerticalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel2.setVerticalTextPosition(javax.swing.SwingConstants.CENTER);
        contentPane.add(jLabel1,  new XYConstraints(35, 8, 139, 27));
        contentPane.add(jLabel2,    new XYConstraints(214, 10, 149, 20));
        contentPane.add(jScrollPane2, new XYConstraints(211, 31, 159, 231));
        contentPane.add(jScrollPane1, new XYConstraints(25, 31, 153, 230));
        jScrollPane1.getViewport().add(jTree1, null);
        jScrollPane2.getViewport().add(jTree2, null);
      }  //Overridden so we can exit when window is closed
      protected void processWindowEvent(WindowEvent e) {
        super.processWindowEvent(e);
        if (e.getID() == WindowEvent.WINDOW_CLOSING) {
          System.exit(0);
        }
      }
    }
      

  2.   

    呵呵。已经解决。
    自己写的。
    不足之处。斧正
    把目的树改了改。:
    package TestApp;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;
    import org.jdom.*;
    import org.jdom.output.*;
    import org.jdom.input.*;
    import java.util.*;/**
     * <p>Title: 
     * <p>Description:
     * @author Zhangb
     * @version 1.0
     */public class DragTargetTree
        extends JTree
        implements DropTargetListener {
        
        private OprXML opx = new OprXML();
    private Document myDoc = opx.readDocument("xml\\listTree.xml");
    private Element root_Element = myDoc.getRootElement();
    private Object tmp_o = null;
    private String[] xml_name = {"object","basyo","contents","koumoku","koumoku1","koumoku2","koumoku3","koumoku4","koumoku5","koumoku6","koumoku7","koumoku8"};
      /**
       * 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) {
      }
      
       /**
       * travel1
       *
       * @param elem Element,node,DefaultMutableTreeNode
       */
      
      public void travel1(Element elem,DefaultMutableTreeNode node) {
    if(elem == null) {
    return;
    }
    if(elem.isRootElement()) {
    if(elem.getAttribute("name").getValue().equals(node.toString())) {
    tmp_o = elem;
    }
    }
    List childrenList = elem.getChildren();
    Iterator i = childrenList.iterator();
    while(i.hasNext()) {
    Object o = i.next();
    String elem_name = ((Element)o).getAttribute("name").getValue();
    if(elem_name.equals(node.toString())) {
    tmp_o = o;
    }else {
    travel1((Element)o,node);
    }
    }
      }
      
       /**
       * add_Element
       *
       * @param List childList, par_Ele Element,node,DefaultMutableTreeNode,level int
       */
       
      public void add_Element(List childList,Element par_Ele,DefaultMutableTreeNode node,int level) {
    String ele_Name = xml_name[level]; 
    Element add_e1 = new Element(ele_Name);
    Attribute att = new Attribute("name",node.toString());
    add_e1.setAttribute(att);
    childList.add(childList.size(),add_e1);

    Enumeration childrenList = node.children();
    level++;
    List childList_2 = add_e1.getChildren();
    while(childrenList.hasMoreElements()) {
    add_Element(childList_2,add_e1,(DefaultMutableTreeNode)childrenList.nextElement(),level);
    }
      }  /**
       * 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);
    OprXML Opr_Wr_Doc = new OprXML();
        
        if (tp != null) {
            try {
            //get drop tree node with treepath
            javax.swing.tree.DefaultMutableTreeNode no1 =
                (javax.swing.tree.DefaultMutableTreeNode) tp.getLastPathComponent();
            parnode = no1;
            System.out.println("depth===>" + parnode.getLevel());
            //String Ele_name = xml_name[parnode.getLevel()];
            int index = parnode.getChildCount();
            System.out.println(parnode.toString());
            // 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);
            travel1(root_Element,parnode); 
            Object par_Ele = tmp_o;
            if(par_Ele == null) {
             System.out.println("Error:");
            }    
           List childList = ((Element)par_Ele).getChildren();
           add_Element(childList,(Element)par_Ele,node2,parnode.getLevel());
           Opr_Wr_Doc.outputDocumentToFile("listTree",myDoc); 
          }
          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;
        }
      }
    }