2013-05-02 9 views
5

mio Java 7 applicazione swing dispone di una JTable che contiene i seguenti oggetti:Java: come trascinare un file da un JTable al filesystem nativo?

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 ... 

} 

L'obiettivo è quello di trascinare questi MyFile oggetti dalla mia applicazione e rilasciarli al filesystem (ad esempio sul desktop). Quando si imposta setDragEnabled (true) sul mio JTable, l'icona diventa già un simbolo "+" quando si trascina una voce di tabella, come noto dal normale trascinamento di azioni & da altre applicazioni. Ma quando in realtà far cadere l'oggetto al desktop non succede nulla ...

Come posso dire al mio JTable solo cadere il File oggetto all'interno del MyFile oggetto ? Ho dimenticato più cose?

Qualcuno potrebbe fornire un breve campione?

Molte grazie per il vostro aiuto in anticipo!

risposta

3

configurare la tabella con le seguenti proprietà:

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

Ecco l'implementazione TransferHandler:

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

Ecco l'implementazione FileTransferable:

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

È necessario assicurarsi che il creato Transferable contiene il DataFlavor#javaFileListFlavor e che i dati per quel sapore è la File contenuta nel vostro MyFile istanza (per essere più precisi: un List con la File, come spiegato nel javadoc di quel sapore).

Questo richiederà probabilmente un numero personalizzato TransferHandler sul numero JTable.

+0

sono dubbi ..., forse nel caso in cui il file non è memorizzato in XxxTableModel – mKorbel

+0

potresti fornire un po 'di mor e informazioni, un breve how-to o anche un esempio :-)? – salocinx