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(); } }
戻る inserted by FC2 system