使用纯Java的快速示例DragGestureListener,DropTargetAdapter并
TransferHandler为一个面板上的图像对另一面板的DnD支持:
选择绿色形状并将其拖动到上方的空白面板后:
import java.awt.BorderLayout;import java.awt.Component;import java.awt.Dimension;import java.awt.Point;import java.awt.datatransfer.DataFlavor;import java.awt.datatransfer.Transferable;import java.awt.datatransfer.UnsupportedFlavorException;import java.awt.dnd.DnDConstants;import java.awt.dnd.DragGestureEvent;import java.awt.dnd.DragGestureListener;import java.awt.dnd.DragSource;import java.awt.dnd.DropTarget;import java.awt.dnd.DropTargetAdapter;import java.awt.dnd.DropTargetDropEvent;import java.io.IOException;import java.net.URL;import javax.swing.Icon;import javax.swing.ImageIcon;import javax.swing.Jframe;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.SwingUtilities;import javax.swing.TransferHandler;import javax.swing.TransferHandler.TransferSupport;import javax.swing.border.TitledBorder;public class Test { public static void main(String[] args) { createAndShowJframe(); } public static void createAndShowJframe() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { Jframe frame = createJframe(); frame.setVisible(true); } }); } private static Jframe createJframe() { Jframe frame = new Jframe(); frame.setDefaultCloseOperation(Jframe.DISPOSE_ON_CLOSE); frame.setTitle("Test"); JPanel panel = createEmptyJPanel(); new MyDropTargetListener(panel);//this must be done or we wont be able to drop any image onto the empty panel frame.add(panel, BorderLayout.CENTER); try { frame.add(createJLabelPanel(), BorderLayout.SOUTH); } catch (Exception ex) { ex.printStackTrace(); } frame.pack(); return frame; } private static JPanel createEmptyJPanel() { final JPanel p = new JPanel() { @Override public Dimension getPreferredSize() { return new Dimension(300, 300); } }; p.setBorder(new TitledBorder("Drag Image onto this panel")); TransferHandler dnd = new TransferHandler() { @Override public boolean canimport(TransferSupport support) { if (!support.isDrop()) { return false; } //only Strings if (!support.isDataFlavorSupported(DataFlavor.imageFlavor)) { return false; } return true; } @Override public boolean importData(TransferSupport support) { if (!canimport(support)) { return false; } Transferable tansferable = support.getTransferable(); Icon ico; try { ico = (Icon) tansferable.getTransferData(DataFlavor.imageFlavor); } catch (Exception e) { e.printStackTrace(); return false; } p.add(new JLabel(ico)); return true; } }; p.setTransferHandler(dnd); return p; } private static JPanel createJLabelPanel() throws Exception { JPanel panel = new JPanel(); panel.setBorder(new TitledBorder("Drag Image from here to Panel above")); JLabel label1 = new JLabel(new ImageIcon(new URL("http://i.stack.imgur.com/gJmeJ.png"))); JLabel label2 = new JLabel(new ImageIcon(new URL("http://i.stack.imgur.com/8BGfi.png"))); JLabel label3 = new JLabel(new ImageIcon(new URL("http://i.stack.imgur.com/1lgtq.png"))); MyDragGestureListener dlistener = new MyDragGestureListener(); DragSource ds1 = new DragSource(); ds1.createDefaultDragGestureRecognizer(label1, DnDConstants.ACTION_COPY, dlistener); DragSource ds2 = new DragSource(); ds2.createDefaultDragGestureRecognizer(label2, DnDConstants.ACTION_COPY, dlistener); DragSource ds3 = new DragSource(); ds3.createDefaultDragGestureRecognizer(label3, DnDConstants.ACTION_COPY, dlistener); panel.add(label1); panel.add(label2); panel.add(label3); return panel; }}class MyDropTargetListener extends DropTargetAdapter { private DropTarget dropTarget; private JPanel p; public MyDropTargetListener(JPanel panel) { p = panel; dropTarget = new DropTarget(panel, DnDConstants.ACTION_COPY, this, true, null); } @Override public void drop(DropTargetDropEvent event) { try { DropTarget test = (DropTarget) event.getSource(); Component ca = (Component) test.getComponent(); Point dropPoint = ca.getMousePosition(); Transferable tr = event.getTransferable(); if (event.isDataFlavorSupported(DataFlavor.imageFlavor)) { Icon ico = (Icon) tr.getTransferData(DataFlavor.imageFlavor); if (ico != null) { p.add(new JLabel(ico)); p.revalidate(); p.repaint(); event.dropComplete(true); } } else { event.rejectDrop(); } } catch (Exception e) { e.printStackTrace(); event.rejectDrop(); } }}class MyDragGestureListener implements DragGestureListener { @Override public void dragGestureRecognized(DragGestureEvent event) { JLabel label = (JLabel) event.getComponent(); final Icon ico = label.getIcon(); Transferable transferable = new Transferable() { @Override public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[]{DataFlavor.imageFlavor}; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { if (!isDataFlavorSupported(flavor)) { return false; } return true; } @Override public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { return ico; } }; event.startDrag(null, transferable); }}


