最近因为在一个项目中要实现JTree之间的拖拽,刚刚学习开始学习Java,参照网上的代码完成的,现在贴出来共享,希望对和我一样的菜鸟有点帮助,有什么错误的话还请多多指正。
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()); }
} }
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(); } 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); } } }

|