2012-06-14 77 views
5

我使用這個代碼在Java Swing應用程序將文件複製到剪貼板:如何在Java中將文件剪切到剪貼板?

final List<File> files = new ArrayList<File>(); 
// ... code to fill list omitted ... // 

Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
    new Transferable() { 
     @Override 
     public DataFlavor[] getTransferDataFlavors() { 
      return new DataFlavor[] { DataFlavor.javaFileListFlavor }; 
     } 

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

     @Override 
     public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { 
      return files; 
     } 
    }, null 
); 

它的工作原理,在這我可以去到Windows資源管理器和Ctrl + V,並將文件轉起來(希望它的工作原理在其他操作系統中,雖然未經測試)。我想實施cut也不過我不知道如何讓系統知道這就是操作的內容,或者如何獲得每個成功複製文件的反饋,以便我可以從原始位置刪除它手動。

如果這不是不可能的,我應該如何處理這個問題的任何建議?我希望能夠在應用程序中刪除&粘貼(單獨與OS Explorer交換文件)。

+0

我不認爲削減是可能在Java中呢。 – rjdkolb

+0

噢,除了Java程序在用戶粘貼文件之前不能退出這個事實之外,代碼在Kubuntu linux(KDE)中很有效。在這裏閱讀更多:http://en.wikipedia.org/wiki/X_Window_selection – rjdkolb

回答

0

還有另外一個帖子里人們討論缺乏的可能性削減文件:

Cutting files into the clipboard with SWT

如果你真的需要它,你可以去的醜陋的方式,並檢查是否有辦法做到這一點通過JNI調用,但那麼你必須爲你想支持的所有平臺做到這一點......

0

這是「有點」可能使用Swing。請參閱TransferHandler.exportToClipboard()。它提供了一個動作。使用exportToClipboard()的正確方法是調用TransferHandler.getCutAction(),然後用新創建的ActionEvent()調用actionPerformed() - 我使用一個帶有TransferHandler的JComponent,它將創建帶有所需文件的Transferable以放入剪貼板。

但相反是不可能的。從剪貼板導入無法知道它是剪切還是複製到剪貼板。 TransferHandler.TransferSupport.getDropAction()僅適用於DND操作。

但是,也許是由剪貼板所有者在傳輸完成後刪除文件。見TransferHandler.exportDone()

也看到錯誤http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6673481

+0

實際上,從Windows API看SetClipboardData它看起來不像你可以指定一個剪切或複製操作。我敢打賭Windows資源管理器使用另一個全球區域來放置此信息。 –

+0

我看不出如何使用這個。我已經使用了所有TransferHandler的東西,但'TransferHandler.exportToClipboard'實際上並不使用'action'參數來做任何不同的事情。 – Boann

+0

它只是使用該操作來調用exportDone()。你的權利,它沒有幫助。我不認爲Java可以做到這一點,因爲剪貼板並沒有實際存儲操作(就我所見,在Windows中)。 –