2013-05-02 5 views
5

Meine Java 7 Swing-Anwendung verfügt über eine JTable, die folgenden Objekte enthält:Java: Wie ziehe ich eine Datei von einer JTable in ein natives Dateisystem?

public class MyFile { 

    private long id; 
    private long created; 
    private long modified; 
    private String description; 
    private File file; 

    public MyFile(long id) { 
     this.id = id; 
     this.created = System.currentTimeMillis(); 
    } 

    // getter & setter methods ... 

} 

Das Ziel ist es, diese MyFile Objekte aus meiner Anwendung zu ziehen und sie auf das Dateisystem (beispielsweise auf den Desktop) fallen. Wenn ich setDragEnabled (true) auf meine JTable setze, wird das Symbol beim Ziehen eines Tabelleneintrags bereits zu einem "+" - Symbol, wie es beim normalen Ziehen von Aktionen aus anderen Anwendungen durch Ziehen & bekannt ist. Aber wenn tatsächlich fallen, das Objekt auf dem Desktop passiert nichts ...

Wie kann ich meine JTable sagen, nur fallen die Datei Objekt innerhalb des MyFile Objekt? Habe ich mehr vergessen?

Kann jemand eine kurze Probe zur Verfügung stellen?

Vielen Dank für Ihre Hilfe im Voraus!

Antwort

3

Konfigurieren Sie Ihre Tabelle mit den folgenden Eigenschaften:

tblDocuments.setDragEnabled(true); 
tblDocuments.setTransferHandler(new FileTransferHandler()); 

Hier ist die TransferHandler Umsetzung:

public class FileTransferHandler extends TransferHandler { 

    @Override 
    protected Transferable createTransferable(JComponent c) { 
     List<File> files = new ArrayList<File>(); 
     // copy your files from the component to a concrete List<File> files ... 
     // the following code would be a sample for a JList filled with java.io.File(s) ... 
     /*JList list = (JList) c; 
     for (Object obj: list.getSelectedValues()) { 
      files.add((File)obj); 
     }*/ 
     return new FileTransferable(files); 
    } 

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

Hier ist die FileTransferable Umsetzung:

public 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; 
    } 
} 
4

Sie müssen sicherstellen, dass das erstellte Transferable die DataFlavor#javaFileListFlavor enthält und dass die Daten für diesen Geschmack der File in Ihrem MyFile Instanz enthalten ist (um genauer zu sein: ein List mit dem File, wie in der javadoc dieses Aroma erklärt).

Dies erfordert wahrscheinlich eine benutzerdefinierte TransferHandler auf Ihrem JTable.

+0

ich Zweifel ... bin, vielleicht in dem Fall, dass die Datei nicht in XxxTableModel – mKorbel

+0

gespeichert ist Könnten Sie etwas mehr bereitstellen Die Informationen, ein kurzes How-To oder sogar eine Probe :-)? – salocinx

Verwandte Themen