2016-11-03 4 views
0

Ich bin mir nicht sicher, ob ich das Prinzip der DataFlavors richtig verstanden habe, aber wie kann ich eigentlich den DataFlavor einer JComponent setzen? Jedes Mal, wenn ich rufen Sie die getDataFlavor Methode der Ausgang ist dies:Wie legt man den DataFlavor einer Komponente fest?

java.awt.datatransfer.DataFlavor[mimetype=application/x-java-file-list;representationclass=java.util.List] 

Mein Problem ist, dass ich Bilder von dem Desktop oder an jedem anderen Ort direkt in meine JPanel ziehen möchten. Es funktioniert durch den DataFlavor.javaFileListFlavor, aber gibt es keine Möglichkeit, dass ich einen benutzerdefinierten Flavor erstellen kann, der zum Beispiel nur PNG- und JPG-Dateien akzeptiert? (Ich weiß, dass es tatsächlich möglich ist, benutzerdefinierte Flavors zu erstellen, aber ich habe keine Ahnung, wie ich die neu erstellten Flavors für meine Komponenten "aktivieren" kann)

Oder gibt es eine Möglichkeit, sicherzustellen, ob das eingezogene Item ist PNG oder JPG mit dem javaFileListFlavor?

Ich hoffe, dass ich gut genug, um meine Frage erklären könnte (ich bin nicht ein Meister dieser Sprache, aber ich versuche mein Bestes;))

+0

Wie werden Sie die TransferHandler Komponenten Handling? –

+0

Ich bin nicht am PC atm, aber ich habe nur eine Klasse, die TransferHandler erweitert und überschreibt die CanImport (...) und die ImportData (...) -Methode. Der canImport ist ein Liner und gibt nur wahr zurück (Weil ich nicht weiß, wie man die übertragenen Daten erhält), die ImportData Funktion erhält jedoch das Übertragbare und durch den dataFlavor konnte ich eine Liste von Dateien erstellen, die dann die Datei enthält mein Bild bei Index 0, wenn der Drop erfolgreich ist. Danach fügen ich den transferHandler durch die setTransferHandler() Methode meines Panels hinzu –

Antwort

1

Oder ist es eine Möglichkeit, ob das, um sicherzustellen, Eingezogenes Objekt ist ein PNG oder JPG mit dem javaFileListFlavor?

Werfen Sie einen Blick auf das Swing-Tutorial auf Top Level Drop. Es zeigt, wie eine Datei vom Desktop in eine JTextArea gezogen wird.

Werfen Sie einen Blick auf die canImport(...) und importData(...) Methoden der TransferHandler. Die Methode canImport(...) prüft derzeit nur, ob Sie eine FileListFlavor-Datei haben. Sie müssten also zusätzliche Logik hinzufügen, um die tatsächliche Datei als PNG oder JPG zu sehen.

Wenn Sie sich die importData(...)-Methode ansehen, können Sie sehen, wie Sie das File-Objekt vom TransferSupport-Objekt erhalten, damit Sie die obige Überprüfung implementieren können.

Edit:

aber wie beschrieben erscheint die Ausnahme

bis ich die Ausnahme einfach ignorieren. Hier ist der modifizierte Code für das Tutorial, der nur erlaubt, ".java" -Dateien in den Textbereich zu kopieren.

private TransferHandler handler = new TransferHandler() { 
    public boolean canImport(TransferHandler.TransferSupport support) { 
     if (!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
      return false; 
     } 

     Transferable t = support.getTransferable(); 

     try 
     { 
      java.util.List<File> l = (java.util.List<File>)t.getTransferData(DataFlavor.javaFileListFlavor); 
      File file = l.get(0); 
      String fileName = file.getName(); 

      if (!file.getName().endsWith(".java")) 
       return false; 
     } 
     catch (Exception e) 
     { 
      // ignore 
     } 

     if (copyItem.isSelected()) { 
      boolean copySupported = (COPY & support.getSourceDropActions()) == COPY; 

      if (!copySupported) { 
       return false; 
      } 

      support.setDropAction(COPY); 
     } 

     return true; 
    } 

funktioniert gut für mich mit JDK8 auf Winodow 7.

+0

Es ist nicht möglich, das File-Objekt vom TransferSupport-Objekt zu bekommen, weil du das Transferable des TransferSupport bekommen müsstest und dadurch eine InvalidDnDOperationException provozieren würdest ich falsch? –

+0

"Die canImport (...) -Methode prüft derzeit nur, ob Sie einen FileListFlavor haben". Hast du irgendwelche Ideen, das zu ändern? Ich habe eine Weile gegoogelt, aber ich habe keine richtige Lösung gefunden. –

+0

@SaliKe, 'oder liege ich falsch?' - Ich weiß es nicht, ich werde es dir ausprobieren lassen und sehen, was passiert. – camickr

Verwandte Themen