源码: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();
}
} }
}
}
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();
}
} }
}
}
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");
}}
/*
* ?建日期 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);
}
}
}