AWTでドラッグアンドドロップを試す(Panel間)
戻る
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.event.*;
import java.io.*;
/**
$Id: panel-dnd.html,v 1.1 2009/06/22 16:12:18 kishi Exp kishi $
*/
public class DNDTest implements DragGestureListener, DragSourceListener,
DropTargetListener, Transferable {
static final DataFlavor[] supportedFlavors = { null };
static
{
try {
supportedFlavors[ 0 ] = new DataFlavor( DataFlavor.javaJVMLocalObjectMimeType );
} catch ( Exception ex ) {
ex.printStackTrace();
}
}
Object object;
// Transferable methods.
public Object getTransferData( DataFlavor flavor ) {
if ( flavor.isMimeTypeEqual( DataFlavor.javaJVMLocalObjectMimeType ) )
return object;
else
return null;
}
public DataFlavor[] getTransferDataFlavors() {
return supportedFlavors;
}
public boolean isDataFlavorSupported( DataFlavor flavor ) {
return flavor.isMimeTypeEqual( DataFlavor.javaJVMLocalObjectMimeType );
}
// DragGestureListener method.
public void dragGestureRecognized( DragGestureEvent ev ) {
ev.startDrag( null, this, this );
}
// DragSourceListener methods.
public void dragDropEnd( DragSourceDropEvent ev ) { }
public void dragEnter( DragSourceDragEvent ev ) { }
public void dragExit( DragSourceEvent ev ) { }
public void dragOver( DragSourceDragEvent ev ) {
object = ev.getSource();
}
public void dropActionChanged( DragSourceDragEvent ev ) { }
// DropTargetListener methods.
public void dragEnter( DropTargetDragEvent ev ) { }
public void dragExit( DropTargetEvent ev ) { }
public void dragOver( DropTargetDragEvent ev ) {
dropTargetDrag( ev );
}
public void dropActionChanged( DropTargetDragEvent ev ) {
dropTargetDrag( ev );
}
void dropTargetDrag( DropTargetDragEvent ev ) {
ev.acceptDrag( ev.getDropAction() );
}
public void drop( DropTargetDropEvent ev ) {
ev.acceptDrop( ev.getDropAction() );
try {
Object target = ev.getSource();
Object source = ev.getTransferable().getTransferData( supportedFlavors[ 0 ] );
Component component = ( ( DragSourceContext ) source ).getComponent();
Container oldContainer = component.getParent();
Container container = ( Container ) ( ( DropTarget ) target ).getComponent();
container.add( component );
oldContainer.validate();
oldContainer.repaint();
container.validate();
container.repaint();
} catch ( Exception ex ) {
ex.printStackTrace();
}
ev.dropComplete( true );
}
public static void main( String[] arg ) {
// ドラッグアンドドロップするコンポーネントの生成
Button button1 = new Button( "このボタンをドラッグしてください。" );
Button button2 = new Button( "このボタンをドラッグしてください。" );
Label label = new Label( "このラベルをドラッグしてください。" );
label.setBackground( Color.yellow );
Checkbox checkbox = new Checkbox( "このチェックボックスをドラッグしてください。" );
Frame frame = new Frame( "パネル間でのDrag'n'Dropのテスト" );
frame.setLayout( new GridLayout( 2, 1 ) );
// 上部のパネル
Panel upperPanel = new Panel();
upperPanel.add( button1 );
upperPanel.add( label );
upperPanel.add( checkbox );
// 下部のパネル
Panel lowerPanel = new Panel();
lowerPanel.setBackground( Color.cyan );
lowerPanel.add( button2 );
frame.add( upperPanel );
frame.add( lowerPanel );
frame.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent we ) {
System.exit( 0 );
}
}
);
DNDTest dndListener = new DNDTest();
DragSource dragSource = new DragSource();
DropTarget dropTarget1 = new DropTarget( upperPanel, DnDConstants.ACTION_MOVE, dndListener );
DropTarget dropTarget2 = new DropTarget( lowerPanel, DnDConstants.ACTION_MOVE, dndListener );
DragGestureRecognizer dragRecognizer1 = dragSource.createDefaultDragGestureRecognizer( button1, DnDConstants.ACTION_MOVE, dndListener );
DragGestureRecognizer dragRecognizer2 = dragSource.createDefaultDragGestureRecognizer( button2, DnDConstants.ACTION_MOVE, dndListener );
DragGestureRecognizer dragRecognizer3 = dragSource.createDefaultDragGestureRecognizer( label, DnDConstants.ACTION_MOVE, dndListener );
DragGestureRecognizer dragRecognizer4 = dragSource.createDefaultDragGestureRecognizer( checkbox, DnDConstants.ACTION_MOVE, dndListener );
frame.setBounds( 0, 200, 800, 400 );
frame.show();
}
}
戻る