2009-07-30 9 views

Répondre

15

Ceci est une applet, mais il fonctionne avec tout cadre ou fenêtre:

public class DropApplet extends Applet implements DropTargetListener { 
    // . . . 
    private DropTarget dropTarget; 
    // . . . 

    public void init() { 
     if (dropTarget == null) { 
      dropTarget = new DropTarget(this, this); 
     } 
     // . . . 
    } 

    public void dragEnter(DropTargetDragEvent arg0) { 
     // nothing 
    } 

    public void dragOver(DropTargetDragEvent arg0) { 
     // nothing 
    } 

    public void dropActionChanged(DropTargetDragEvent arg0) { 
     // nothing 
    } 

    public void dragExit(DropTargetEvent arg0) { 
     // nothing 
    } 

    public void drop(DropTargetDropEvent evt) { 
     final List result = new ArrayList(); 
     int action = evt.getDropAction(); 
     evt.acceptDrop(action); 
     try { 
      Transferable data = evt.getTransferable(); 
      DataFlavor flavors[] = data.getTransferDataFlavors(); 
      if (data.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
       List<File> list = (List<File>) data.getTransferData(
        DataFlavor.javaFileListFlavor); 
       processFiles(list); 
      } 
     } catch (UnsupportedFlavorException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      evt.dropComplete(true); 
      repaint(); 
     } 
    } 

    private void processFiles(List<File> files) throws IOException { 
     // . . . 
    } 
} 

Faire glisser des fichiers à partir d'une application Swing sur le bureau est un peu plus compliqué, et tous les composants Swing sont capables de le faire.

Voici un exemple avec un JList contenant des fichiers. Vous pouvez déposer des fichiers du Finder/Explorer dans cette liste, puis faire glisser ces fichiers vers un autre emplacement.

package dnd; 

import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.awt.datatransfer.UnsupportedFlavorException; 
import java.awt.dnd.DropTarget; 
import java.awt.dnd.DropTargetDragEvent; 
import java.awt.dnd.DropTargetDropEvent; 
import java.awt.dnd.DropTargetEvent; 
import java.awt.dnd.DropTargetListener; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.DefaultListModel; 
import javax.swing.JComponent; 
import javax.swing.JList; 
import javax.swing.TransferHandler; 

public class DnDFrame extends javax.swing.JFrame implements DropTargetListener { 

    private DefaultListModel listModel = new DefaultListModel(); 
    private DropTarget dropTarget; 

    /** Creates new form DnDFrame */ 
    public DnDFrame() { 
     initComponents(); 
     dropTarget = new DropTarget(list, this); 
     list.setModel(listModel); 
     list.setDragEnabled(true); 
     list.setTransferHandler(new FileTransferHandler()); 
    } 

    /** This method is called from within the constructor to 
    * initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is 
    * always regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 
     java.awt.GridBagConstraints gridBagConstraints; 

     jLabel1 = new javax.swing.JLabel(); 
     jScrollPane1 = new javax.swing.JScrollPane(); 
     list = new javax.swing.JList(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     getContentPane().setLayout(new java.awt.GridBagLayout()); 

     jLabel1.setText("Files:"); 
     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; 
     gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 
     getContentPane().add(jLabel1, gridBagConstraints); 

     jScrollPane1.setViewportView(list); 

     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; 
     gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 
     getContentPane().add(jScrollPane1, gridBagConstraints); 

     pack(); 
    }// </editor-fold> 
    // Variables declaration - do not modify 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JScrollPane jScrollPane1; 
    private javax.swing.JList list; 
    // End of variables declaration 

    public void dragEnter(DropTargetDragEvent arg0) { 
     // nothing 
     } 

    public void dragOver(DropTargetDragEvent arg0) { 
     // nothing 
     } 

    public void dropActionChanged(DropTargetDragEvent arg0) { 
     // nothing 
     } 

    public void dragExit(DropTargetEvent arg0) { 
     // nothing 
     } 

    public void drop(DropTargetDropEvent evt) { 
     int action = evt.getDropAction(); 
     evt.acceptDrop(action); 
     try { 
      Transferable data = evt.getTransferable(); 
      if (data.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
       List<File> files = (List<File>) data.getTransferData(
         DataFlavor.javaFileListFlavor); 
       for (File file : files) { 
        listModel.addElement(file); 
       } 
      } 
     } catch (UnsupportedFlavorException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      evt.dropComplete(true); 
     } 
    } 

    private class FileTransferHandler extends TransferHandler { 

     @Override 
     protected Transferable createTransferable(JComponent c) { 
      JList list = (JList) c; 
      List<File> files = new ArrayList<File>(); 
      for (Object obj: list.getSelectedValues()) { 
       files.add((File)obj); 
      } 
      return new FileTransferable(files); 
     } 

     @Override 
     public int getSourceActions(JComponent c) { 
      return MOVE; 
     } 
    } 

    private class FileTransferable implements Transferable { 

     private List<File> files; 

     public FileTransferable(List<File> files) { 
      this.files = files; 
     } 

     public DataFlavor[] getTransferDataFlavors() { 
      return new DataFlavor[]{DataFlavor.javaFileListFlavor}; 
     } 

     public boolean isDataFlavorSupported(DataFlavor flavor) { 
      return flavor.equals(DataFlavor.javaFileListFlavor); 
     } 

     public Object getTransferData(DataFlavor flavor) 
       throws UnsupportedFlavorException, IOException { 
      if (!isDataFlavorSupported(flavor)) { 
       throw new UnsupportedFlavorException(flavor); 
      } 
      return files; 
     } 
    } 
} 
+0

Merci beaucoup. Puis-je faire glisser de Swing App à l'explorateur? – freddiefujiwara

+0

Ajout d'un exemple qui fait les deux –

+0

Je travaille actuellement sur des trucs DnD. Curieux de savoir s'il y a une raison pour laquelle vous avez utilisé les trucs AWT au lieu de Swing, c'est-à-dire TransferHandler, TransferSupport, etc. –

Questions connexes