2012-06-14 9 views
5

ich in einer Java-Swing-Anwendung dieses Code verwenden Dateien in die Zwischenablage zu kopieren:Wie schneidet man eine Datei in Java in die Zwischenablage?

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

Es funktioniert, dass in I zu Windows Explorer und Strg + V und die Dateien wieder auftauchen gehen kann (hoffentlich funktioniert es in anderen Betriebssystemen, obwohl nicht getestet). Ich würde gerne implementieren Schnitt auch, aber ich weiß nicht, wie das System wissen, dass das ist, was die Aktion ist, oder alternativ, wie Sie Feedback für jede erfolgreich kopierte Datei erhalten, damit ich es von seinem ursprünglichen Speicherort löschen kann manuell.

Wenn das nicht unmöglich ist, irgendwelche Vorschläge, wie ich damit umgehen sollte? Ich würde gerne in der Lage sein, & innerhalb der Anwendung zu schneiden (separat zum Austausch von Dateien mit dem OS Explorer).

+0

Ich glaube nicht möglich noch in Java geschnitten ist. – rjdkolb

+0

Oh, der Code funktioniert gut in Kubuntu Linux (KDE) mit Ausnahme der Tatsache, dass das Java-Programm nicht beendet werden darf, bevor der Benutzer die Datei einfügt. Lesen Sie hier mehr: http://en.wikipedia.org/wiki/X_Window_selection – rjdkolb

Antwort

0

Es ist ein weiterer Beitrag, wo die Menschen die fehlende Möglichkeit diskutieren Dateien zu schneiden:

Cutting files into the clipboard with SWT

Wenn Sie es wirklich brauchen Sie die hässliche Weg zu gehen und überprüfen, ob es einen Weg gibt, dies zu tun über JNI-Aufrufe, aber dann müssen Sie das für alle Plattformen tun, die Sie unterstützen möchten ...

0

Dies ist "etwas" möglich mit Swing. Siehe TransferHandler.exportToClipboard(). Es bietet eine Aktion. Die richtige Methode für die Verwendung von exportToClipboard() ist das Aufrufen von TransferHandler.getCutAction() und dann das Aufrufen von actionPerformed() mit einem neu erstellten ActionEvent() - ich verwende eine JComponent mit einem zugewiesenen TransferHandler, der das Übertragbare mit den gewünschten Dateien zum Zwischenspeichern erstellt .

Aber das Gegenteil ist nicht möglich. Beim Import aus der Zwischenablage kann nicht festgestellt werden, ob es ausgeschnitten oder in die Zwischenablage kopiert wurde. TransferHandler.TransferSupport.getDropAction() funktioniert nur für DND-Vorgänge.

Aber vielleicht ist es Sache des Eigentümers der Zwischenablage, die Dateien zu löschen, nachdem die Übertragung abgeschlossen ist. Siehe TransferHandler.exportDone()

Auch Fehler sehen http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6673481

+0

Wenn Sie SetClipboardData von Windows API betrachten, sieht es nicht so aus, als könnten Sie eine Ausschneide- oder Kopieraktion zuweisen. Ich wette, Windows Explorer verwendet einen anderen globalen Bereich, um diese Informationen zu platzieren. –

+0

Ich kann nicht sehen, wie man das ausnutzt. Ich benutze bereits den ganzen TransferHandler-Kram, aber 'TransferHandler.exportToClipboard' verwendet den * action'-Parameter nicht, um etwas anderes zu tun. – Boann

+0

Es verwendet nur die Aktion, um exportDone() aufzurufen. Dein Recht, es hilft nicht. Ich glaube nicht, dass Java das kann, da die Zwischenablage die Aktion nicht speichert (soweit ich das in Windows sehen kann). –

Verwandte Themen