源码:package dndtree;import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.dnd.*;
import java.awt.dnd.DnDConstants;
import java.io.IOException;
import java.awt.datatransfer.*;/**
* Title:
* Description:
* Copyright: Copyright (c)
* Company:
* @author
* @version 1.0
*/public class DNDTree extends JTree {
DNDTree dndTree = null;
public DNDTree() {
DNDTreeHandler dndHandler = new DNDTreeHandler(this); setAutoscrolls(true);
dndTree = this;
} public DNDTree(DefaultTreeModel treeModel) {
super(treeModel);
DNDTreeHandler dndHandler = new DNDTreeHandler(this); setAutoscrolls(true);
dndTree = this;
} public class DNDTreeHandler extends DnDHandler {
TransferableDataItem transDataItem = new TransferableDataItem(); public DNDTreeHandler(Component dndComponent) {
super(dndComponent);
}
public DataFlavor[] getSupportedDataFlavors() {
return transDataItem.getTransferDataFlavors();
} /**
* Gets the data from the selected object being dragged
*
* @return node DataItem being dragged
*/
public Transferable getTransferable() {
TreePath path = getSelectionPath();
DefaultMutableTreeNode selection = (DefaultMutableTreeNode) path.getLastPathComponent();
if (path == null) {
return (null);
} else {
TransferableDataItem node = new TransferableDataItem(selection);// System.out.println("..............parent:" + selection.getParent().toString());
// TreeNode parent = selection.getParent();
// System.out.println(
// "..............ChildCount before removing:" + parent.getChildCount());
//
// DefaultTreeModel model = (DefaultTreeModel) getModel();
// if (parent != null) {
// System.out.println("..............removing.");
// model.removeNodeFromParent(selection);
// model.reload(parent);
// }
//
// System.out.println(
// "..............ChildCount after removing:" + parent.getChildCount()); return (node);
}
} /**
* Handles the drop of the component after the drag is complete
*
* @param transferable Object being dropped
* @param event drop event information
*/
public void handleDrop(Transferable transferable, DropTargetDropEvent event)
throws Exception {
Point location = event.getLocation();
//Get path of node where object being dropped
TreePath path = getClosestPathForLocation(location.x, location.y);
//No drop target
if (path == null) {
System.err.println("Rejected");
event.rejectDrop();
} else {
Transferable tr = event.getTransferable(); if (tr
.isDataFlavorSupported(TransferableDataItem.DEFAULT_MUTABLE_DATAITEM_FLAVOR)) {
System.out.println("Got transfered data");
Object userObject =
tr.getTransferData(TransferableDataItem.DEFAULT_MUTABLE_DATAITEM_FLAVOR);
DefaultMutableTreeNode node =
(DefaultMutableTreeNode) path.getLastPathComponent();
DefaultMutableTreeNode newNode =
new DefaultMutableTreeNode(userObject.toString()); DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) userObject;
System.out.println(
"..............parent:" + currentNode.getParent().toString());
TreeNode parent = currentNode.getParent();
System.out.println(
"..............ChildCount before removing:" + parent.getChildCount()); DefaultTreeModel model = (DefaultTreeModel)getModel();
if (parent != null) {
System.out.println("..............removing.");
model.removeNodeFromParent(currentNode);
model.reload(parent);
}

//setModel(model); System.out.println(
"..............ChildCount after removing:" + parent.getChildCount());
model.insertNodeInto(newNode, node, 0);

event.getDropTargetContext().dropComplete(true); } else {
System.err.println("Rejected");
event.rejectDrop();
}
} }
}
}

解决方案 »

  1.   

    源码:
    package dndtree;import java.awt.dnd.*;
    import java.awt.datatransfer.*;
    import java.awt.Cursor;
    import java.awt.Component;public abstract class DnDHandler
    implements DropTargetListener, DragSourceListener, DragGestureListener {
    protected DropTarget dropTarget;
    protected DragSource dragSource; public DnDHandler(Component dndComponent) {
    dropTarget = new DropTarget(dndComponent, this);
    dragSource = new DragSource();
    dragSource.createDefaultDragGestureRecognizer(
    dndComponent,
    DnDConstants.ACTION_COPY_OR_MOVE,
    this);
    } //creates transferable based on what's selected or returns null if nothings selected
    protected abstract Transferable getTransferable();
    protected abstract void handleDrop(Transferable transferable, DropTargetDropEvent event)
    throws Exception;
    protected abstract DataFlavor[] getSupportedDataFlavors(); public void dropFailed(DragSourceDropEvent event) {
    System.out.println("Drop Failed");
    } public void dropSuccess(DragSourceDropEvent event) {
    System.out.println("Drop was successful");
    } private boolean isTransferableSupported(Transferable t) {
    DataFlavor[] flavors = getSupportedDataFlavors();
    for (int i = 0; i < flavors.length; i++) {
    if (t.isDataFlavorSupported(flavors[i]))
    return true;
    }
    return false;
    } public void dragGestureRecognized(DragGestureEvent event) { Transferable trans = getTransferable();
    Cursor dragIcon = getDragCursor(event); if (trans != null) {
    // Starts the dragging
    dragSource.startDrag(event, dragIcon, trans, this);
    } else {
    System.out.println("nothing was selected");
    }
    }
    /**
    * a drop has occurred
    *
    */
    public void drop(DropTargetDropEvent event) { try {
    Transferable transferable = event.getTransferable(); // we accept only Strings
    if (isTransferableSupported(transferable)) {
    event.acceptDrop(event.getDropAction());
    handleDrop(transferable, event);
    event.getDropTargetContext().dropComplete(true);
    } else {
    event.rejectDrop();
    }
    } catch (Exception e) {
    e.printStackTrace();
    System.err.println("Drop Exception" + e.getMessage());
    event.rejectDrop();
    } } //DragSourceListener interfaces
    /**
    * is invoked when you are dragging over the DropSite
    *
    */
    public void dragEnter(DropTargetDragEvent event) { // debug messages for diagnostics
    //System.out.println( "dragEnter"); int action = event.getDropAction();
    event.acceptDrag(action); } /**
    * is invoked when you are exit the DropSite without dropping
    *
    */
    public void dragExit(DropTargetEvent event) {
    System.out.println( "target dragExit");
    } /**
    * is invoked when a drag operation is going on
    *
    */
    public void dragOver(DropTargetDragEvent event) {
    //System.out.println( "dragOver");
    }
    /**
    * is invoked if the use modifies the current drop gesture
    *
    */ public void dropActionChanged(DropTargetDragEvent event) {
    } //gets the cursor to start drag
    protected Cursor getDragCursor(DragGestureEvent event) {
    if (event.getDragAction() == DnDConstants.ACTION_MOVE) {
    return DragSource.DefaultMoveDrop;
    }
    if (event.getDragAction() == DnDConstants.ACTION_COPY_OR_MOVE) {
    return DragSource.DefaultCopyDrop;
    } else {
    return Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
    }
    } /**
    * this message goes to DragSourceListener, informing it that the dragging
    * has ended
    *
    */ public void dragDropEnd(DragSourceDropEvent event) {
    if (event.getDropSuccess()) {
    dropSuccess(event);
    } else {
    dropFailed(event);
    }
    } /**
    * this message goes to DragSourceListener, informing it that the dragging
    * has entered the DropSite
    *
    */
    public void dragEnter(DragSourceDragEvent event) {
    System.out.println( "dragEnter");
    } /**
    * this message goes to DragSourceListener, informing it that the dragging
    * has exited the DropSite
    *
    */
    public void dragExit(DragSourceEvent event) {
    System.out.println( "source dragExit");
    }
    /**
    * this message goes to DragSourceListener, informing it that the dragging is currently
    * ocurring over the DropSite
    *
    */
    public void dragOver(DragSourceDragEvent event) {
    //System.out.println( "dragOver"); } /**
    * is invoked when the user changes the dropAction
    *
    */
    public void dropActionChanged(DragSourceDragEvent event) {
    System.out.println( "dropActionChanged");
    }}
      

  2.   

    源码:
    /*
     * ?建日期 2005-3-22
     *
     * 更改所生成檔範本?
     * 窗口 > 首?? > Java > 代?生成 > 代?和注?
     */
    package dndtree;import java.awt.AWTEvent;
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.WindowEvent;import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeModel;/**
     * <p>Title:Demo.java</p>
     * <p>Description:</p>
     * <p>Copyright:Copyright (c) 2004 DSII,Inc</p>
     * <p>Company:DSII,Inc</p>
     * @author Jason 2005-3-22
     * @version 1.0
     */
    public class Demo extends JFrame {
    JPanel contentPane;
    JScrollPane jScrollPane1 = new JScrollPane();
    DNDTree jTree1;
    JLabel jLabel1 = new JLabel(); //Construct the frame
    public Demo() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
    jbInit();
    } catch (Exception e) {
    e.printStackTrace();
    }
    } public static void main(String[] args) {
    Demo demo = new Demo();
    demo.show();
    } //Component initialization
    private void jbInit() throws Exception {
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("資源管理器");
    DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("我的公事包");
    DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("我的電腦");
    DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("收藏夾");
    DefaultMutableTreeNode node4 = new DefaultMutableTreeNode("Readme"); DefaultTreeModel treeModel = new DefaultTreeModel(root);
    treeModel.insertNodeInto(node1, root, root.getChildCount());
    treeModel.insertNodeInto(node2, root, root.getChildCount());
    treeModel.insertNodeInto(node3, root, root.getChildCount());
    treeModel.insertNodeInto(node4, root, root.getChildCount()); DefaultMutableTreeNode leafnode = new DefaultMutableTreeNode("公司文件");
    treeModel.insertNodeInto(leafnode, node1, node1.getChildCount());
    leafnode = new DefaultMutableTreeNode("個人信件");
    treeModel.insertNodeInto(leafnode, node1, node1.getChildCount());
    leafnode = new DefaultMutableTreeNode("私人文件");
    treeModel.insertNodeInto(leafnode, node1, node1.getChildCount()); leafnode = new DefaultMutableTreeNode("本機磁片(C:)");
    treeModel.insertNodeInto(leafnode, node2, node2.getChildCount());
    leafnode = new DefaultMutableTreeNode("本機磁片(D:)");
    treeModel.insertNodeInto(leafnode, node2, node2.getChildCount());
    leafnode = new DefaultMutableTreeNode("本機磁片(E:)");
    treeModel.insertNodeInto(leafnode, node2, node2.getChildCount()); DefaultMutableTreeNode node31 = new DefaultMutableTreeNode("網站列表");
    treeModel.insertNodeInto(node31, node3, node3.getChildCount());
    leafnode = new DefaultMutableTreeNode("奇摩站");
    treeModel.insertNodeInto(leafnode, node3, node3.getChildCount());
    leafnode = new DefaultMutableTreeNode("職棒消息");
    treeModel.insertNodeInto(leafnode, node3, node3.getChildCount());
    leafnode = new DefaultMutableTreeNode("網路書店");
    treeModel.insertNodeInto(leafnode, node3, node3.getChildCount()); jTree1 = new DNDTree(treeModel);
    contentPane = (JPanel) this.getContentPane();
    contentPane.setLayout(new BorderLayout());
    this.setSize(new Dimension(400, 300));
    this.setTitle("Demo");
    jLabel1.setFont(new java.awt.Font("DialogInput", 0, 16));
    jLabel1.setText("tree example");
    contentPane.add(jLabel1, BorderLayout.NORTH);
    contentPane.add(jScrollPane1, BorderLayout.CENTER);
    jScrollPane1.getViewport().add(jTree1, 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);
    }
    }
    }