Второй пример по Drag & Drop
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.dnd.*;
import java.awt.datatransfer.*;
public class DragAndDrop extends Frame
{
JButton button = new JButton("Hello");
JPanel panel = new JPanel();
ComponentA component1=new ComponentA(button);
public DragAndDrop()
{
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
dispose();
System.exit(0);
}
});
this.add(panel);
panel.add(component1);
panel.add(button);
setDrag();
}
public static void main(String args[])
{
System.out.println("Starting Drag And Drop Example ...");
DragAndDrop mainFrame = new DragAndDrop();
mainFrame.setSize(400, 400);
mainFrame.setLocation(100,100);
mainFrame.setTitle("Drag And Drop Example");
mainFrame.setVisible(true);
}
void setDrag()
{
class ViewTransferable implements Transferable
{
DataFlavor[] flavors = new DataFlavor[]{DataFlavor.stringFlavor};
public ViewTransferable()
{
}
public DataFlavor[] getTransferDataFlavors()
{
return flavors;
}
public boolean isDataFlavorSupported(DataFlavor flavor)
{
if (flavor.equals(flavors[0]))
{
return true;
}
return false;
}
public Object getTransferData(DataFlavor flavor)throws UnsupportedFlavorException
{
if (!isDataFlavorSupported(flavor))
{
System.out.println("unsuported flavor");
return null;
}
if (flavor.equals(flavors[0]))
{
return(null);
}
return null;
}
}
class CanvasDragSource implements DragGestureListener, DragSourceListener
{
CanvasDragSource()
{
DragSource dragSource = DragSource.getDefaultDragSource();
dragSource.createDefaultDragGestureRecognizer(button,DnDConstants.ACTION_COPY_OR_MOVE,this);
}
public void dragGestureRecognized(DragGestureEvent dge)
{
Transferable transferable = new ViewTransferable();
dge.startDrag(null,transferable,this);
}
public void dropActionChanged(DragSourceDragEvent dsde){}
public void dragEnter(DragSourceDragEvent dsde){}
public void dragOver(DragSourceDragEvent dsde){}
public void dragExit(DragSourceEvent dse){}
public void dragDropEnd(DragSourceDropEvent dsde){}
}
class CanvasDropTarget implements DropTargetListener
{
DropTarget dropTarget;
boolean acceptableType;
CanvasDropTarget()
{
dropTarget = new DropTarget(panel, DnDConstants.ACTION_COPY_OR_MOVE,this,true,null);
}
public void dragOver(DropTargetDragEvent dtde)
{
acceptOrRejectDrag(dtde);
component1.setVisible(true);
component1.setBounds((int)dtde.getLocation().getX()+1,(int)dtde.getLocation().getY()+1,button.getWidth(),button.getHeight());
}
public void dropActionChanged(DropTargetDragEvent dtde)
{
acceptOrRejectDrag(dtde);
}
public void dragExit(DropTargetEvent dte){}
public void drop(DropTargetDropEvent dtde)
{
if ((dtde.getDropAction() & DnDConstants.ACTION_COPY_OR_MOVE) != 0)
{
dtde.acceptDrop(dtde.getDropAction());
dtde.getDropTargetContext().dropComplete(true);
double x = dtde.getLocation().getX();
double y = dtde.getLocation().getY();
button.setLocation((int)x,(int)y);
component1.setVisible(false);
}
else
{
dtde.rejectDrop();
}
}
public void dragEnter(DropTargetDragEvent dtde)
{
checkTransferType(dtde);
acceptOrRejectDrag(dtde);
}
boolean acceptOrRejectDrag(DropTargetDragEvent dtde)
{
int dropAction = dtde.getDropAction();
int sourceActions = dtde.getSourceActions();
boolean acceptedDrag = false;
if (!acceptableType || (sourceActions &DnDConstants.ACTION;_COPY_OR_MOVE) == 0)
{
dtde.acceptDrag(DnDConstants.ACTION_COPY);
acceptedDrag = true;
}
else if ((dropAction & DnDConstants.ACTION_COPY_OR_MOVE ) == 0)
{
dtde.acceptDrag(DnDConstants.ACTION_COPY);
acceptedDrag = true;
}
return acceptedDrag;
}
void checkTransferType(DropTargetDragEvent dtde)
{
acceptableType = dtde.isDataFlavorSupported(DataFlavor.stringFlavor);
}
}
new CanvasDragSource();
new CanvasDropTarget();
}
}
class ComponentA extends JComponent
{
Image img;
JComponent comp;
ComponentA(JComponent comp)
{
this.comp=comp;
setVisible(false);
}
public void paintComponent(Graphics g)
{
img = createImage(comp.getWidth(),comp.getHeight());
comp.paint(img.getGraphics());
g.drawImage(img,0,0,this);
}
}
jar-архив