2012-06-14 9 views
5

Tôi đang sử dụng mã này trong một ứng dụng Java Swing để sao chép các file vào clipboard:Làm thế nào để cắt một tệp vào clipboard trong 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 
); 

Nó hoạt động, trong đó tôi có thể đi đến Windows Explorer và Ctrl + V và các tập tin bật lên (hy vọng nó hoạt động trong các hệ điều hành khác, mặc dù không được kiểm tra). Tôi cũng muốn thực hiện cũng cắt nhưng tôi không biết cách để hệ thống biết rằng đó là hành động hoặc cách nhận phản hồi cho từng tệp được sao chép thành công để tôi có thể xóa nó khỏi vị trí ban đầu của nó bằng tay.

Nếu điều này là không thể, bất kỳ đề xuất nào về cách tôi nên xử lý việc này? Tôi cũng muốn có thể cắt dán & trong ứng dụng (riêng biệt để trao đổi tệp với trình khám phá hệ điều hành).

+0

Tôi không nghĩ rằng có thể cắt trong Java. – rjdkolb

+0

Ồ, mã hoạt động tốt trong Linux Kubuntu (KDE) ngoại trừ thực tế là chương trình Java không được thoát trước khi người dùng dán tập tin. đọc thêm tại đây: http://en.wikipedia.org/wiki/X_Window_selection – rjdkolb

Trả lời

0

Có một bài mà mọi người thảo luận về việc thiếu một khả năng cắt file:

Cutting files into the clipboard with SWT

Nếu bạn thực sự cần nó, bạn có thể đi theo con đường xấu xí và kiểm tra xem có một cách để làm điều này thông qua các cuộc gọi JNI, nhưng sau đó bạn phải làm điều đó cho tất cả các nền tảng mà bạn muốn hỗ trợ ...

0

Điều này "hơi" có thể bằng cách sử dụng Swing. Xem TransferHandler.exportToClipboard(). Nó cung cấp một hành động. Cách thích hợp để sử dụng exportToClipboard() là gọi TransferHandler.getCutAction() và sau đó gọi actionPerformed() với một ActionEvent mới được tạo() - tôi sử dụng JComponent với TransferHandler được gán để tạo ra các tệp có thể chuyển được với các tệp mong muốn .

Nhưng điều ngược lại là không thể. Việc nhập từ clipboard không có cách nào để biết nếu nó được cắt hoặc sao chép vào clipboard. TransferHandler.TransferSupport.getDropAction() chỉ hoạt động cho các hoạt động DND.

Nhưng có thể tùy thuộc vào chủ sở hữu khay nhớ tạm để xóa tệp sau khi quá trình chuyển hoàn tất. Xem TransferHandler.exportDone()

Ngoài ra, hãy xem lỗi http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6673481

+0

Thực tế nhìn vào SetClipboardData từ Windows API, nó không giống như bạn có thể gán một hành động cắt hoặc sao chép. Tôi đặt cược Windows Explorer sử dụng một khu vực toàn cầu khác để đặt thông tin này. –

+0

Tôi không thể thấy cách sử dụng điều này. Tôi đã sử dụng tất cả các công cụ TransferHandler, nhưng 'TransferHandler.exportToClipboard' không thực sự * sử dụng * tham số' action' để làm bất cứ điều gì khác. – Boann

+0

Nó chỉ sử dụng hành động để gọi exportDone(). Quyền của bạn, nó không giúp được gì. Tôi không nghĩ rằng Java có thể làm điều đó kể từ khi clipboard không thực sự lưu trữ các hành động (như xa như tôi có thể nhìn thấy trong Windows). –