2013-05-02 36 views
5

My Java 7 ứng dụng Swing có JTable có chứa các đối tượng sau đây:Java: Cách kéo tệp từ JTable vào hệ thống tệp gốc?

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

} 

Mục đích là để kéo những MyFile đối tượng ra khỏi ứng dụng của tôi và thả chúng vào hệ thống tập tin (ví dụ máy tính để bàn). Khi đặt setDragEnabled (true) thành JTable của tôi, biểu tượng đã chuyển thành biểu tượng "+" khi kéo mục nhập bảng, như được biết bằng cách kéo thường xuyên các thao tác thả từ các ứng dụng khác xuống. Nhưng khi thực sự thả các đối tượng máy tính để bàn có gì xảy ra ...

Làm thế nào tôi có thể nói JTable của tôi chỉ thả các tập tin đối tượng bên trong MyFile đối tượng? Tôi đã quên nhiều thứ chưa?

Ai đó có thể cung cấp mẫu ngắn không?

Rất cám ơn sự giúp đỡ của bạn trước!

Trả lời

3

Cấu hình bảng của bạn với các thuộc tính sau:

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

Đây là việc thực hiện 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; 
    } 
} 

Đây là việc thực hiện 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

Bạn phải chắc chắn rằng tạo Transferable chứa DataFlavor#javaFileListFlavor và dữ liệu cho hương vị đó là File chứa trong MyFile dụ của bạn (chính xác hơn: a List với File, như được giải thích trong javadoc của hương vị mà).

Điều này có thể sẽ yêu cầu tùy chỉnh TransferHandler trên số JTable của bạn.

+0

Tôi nghi ngờ ..., có thể trong trường hợp Tệp không được lưu trữ trong XxxTableModel – mKorbel

+0

Bạn có thể cung cấp một số mor e thông tin, một cách ngắn hoặc thậm chí một mẫu :-)? – salocinx