2009-07-30 22 views

Trả lời

15

Đây là một applet, nhưng nó hoạt động với bất kỳ khung hoặc cửa sổ:

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 { 
     // . . . 
    } 
} 

Kéo tập tin từ một ứng dụng swing máy tính để bàn là hơi phức tạp, và không phải tất cả các thành phần xoay có khả năng làm điều đó.

Dưới đây là ví dụ về tệp chứa JList. Bạn có thể thả tệp từ công cụ tìm/thám hiểm vào danh sách này và sau đó kéo các tệp này đến vị trí khác.

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

Cảm ơn bạn rất nhiều. Tôi có thể kéo từ Swing App đến thám hiểm không? – freddiefujiwara

+0

Thêm một ví dụ làm cả hai –

+0

Tôi đang làm việc trên một số công cụ DnD ngay bây giờ. Tò mò để biết nếu có bất kỳ lý do gì bạn đã sử dụng công cụ AWT thay vì Swing, tức là TransferHandler, TransferSupport, v.v. –

Các vấn đề liên quan