2012-06-14 15 views
5

estoy utilizando este código en una aplicación Java Swing para copiar archivos en el portapapeles:Cómo cortar un archivo en el portapapeles en 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 
); 

Funciona, en el que puedo ir al Explorador de Windows y Ctrl + V y los archivos de subir (es de esperar que funciona en otros sistemas operativos, aunque no probado). Me gustaría implementar cortar también, pero no sé cómo hacer para que el sistema sepa que esa es la acción o, alternativamente, cómo obtener retroalimentación para cada archivo copiado con éxito para poder eliminarlo de su ubicación original a mano.

Si esto no es imposible, ¿alguna sugerencia sobre cómo debo manejar esto? Me gustaría poder cortar & pegar dentro de la aplicación también (por separado para intercambiar archivos con el explorador de sistema operativo).

+0

no creo que cortar es posible en Java aún. – rjdkolb

+0

Oh, el código funciona muy bien en Kubuntu Linux (KDE), excepto por el hecho de que el programa Java no debe salir antes de que el usuario pegue el archivo. lea más aquí: http://en.wikipedia.org/wiki/X_Window_selection – rjdkolb

Respuesta

0

Hay otro post donde la gente habla de la falta de una posibilidad de cortar archivos:

Cutting files into the clipboard with SWT

Si realmente lo necesite que podrían seguir el camino feo y comprobar si hay una manera de hacer esto a través de llamadas JNI, pero luego tiene que hacer eso para todas las plataformas que desee admitir ...

0

Esto es "algo" posible usando Swing. Ver TransferHandler.exportToClipboard(). Ofrece una acción. La forma correcta de usar exportToClipboard() es llamar a TransferHandler.getCutAction() y luego llamar a actionPerformed() con un ActionEvent recién creado() - Yo uso un JComponent con un TransferHandler asignado que creará el transferible con los archivos deseados para ponerlo en el portapapeles .

Pero lo contrario no es posible. La importación desde el portapapeles no tiene forma de saber si está cortada o copiada en el portapapeles. TransferHandler.TransferSupport.getDropAction() solo funciona para operaciones DND.

Pero tal vez corresponda al propietario del portapapeles borrar los archivos una vez que se haya completado la transferencia. Ver TransferHandler.exportDone()

ver también fallo http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6673481

+0

En realidad, mirando SetClipboardData desde la API de Windows no parece que pueda asignar una acción de corte o copia. Apuesto a que Windows Explorer usa otra área global para colocar esta información. –

+0

No puedo ver cómo hacer uso de esto. Ya uso todas las cosas de TransferHandler, pero 'TransferHandler.exportToClipboard' en realidad * no usa * el parámetro' action' para hacer algo diferente. – Boann

+0

Simplemente usa la acción para llamar a exportDone(). Tu derecho, no ayuda. No creo que Java pueda hacerlo, ya que el portapapeles en realidad no almacena la acción (por lo que puedo ver en Windows). –

Cuestiones relacionadas