Ich experimentiere derzeit mit Drag & Drop Java 7 Update 21.Java 7: Wie implementiert man Drag & Drop in Java?
Mein Ziel-Betriebssysteme sind:
- Windows 7
- Ubuntu 12.04
- Mac OSX 10,6/10,8
Die Anforderungen sind:
ziehen Sie Dateien aus dem Dateisystem und legen Sie es auf meine Java-Anwendung (eine Kopie der Datei in ein temporäres Verzeichnis zu machen) -> arbeitet für Linux & MacOSX & Windows-
Drag E-Mails aus Thunderbird und Drop auf meine Java-Anwendung (Speicher sie als komplette * EML-Datei auf dem Dateisystem)
der folgende Code mit einfacher Datei arbeitet fällt auf meine Anwendung für Windows, Mac OS X und Ubuntu. Eine weitere Anforderung besteht darin, E-Mails von Thunderbird an meine Java-Anwendung zu senden (die E-Mail wird automatisch in eine * .eml-Datei konvertiert und auf der Festplatte gespeichert). Dies funktioniert auch für Windows, aber ich erhalte eine „Data Flavor nicht unterstützt Ausnahme“ in Ubuntu und Mac OS X ...
EDIT: Ich habe versucht, es mit OpenJDK 7 auf Ubuntu, aber mit, dass auch normale Datei fällt doesn arbeite nicht. Nur mit der JDK-Version von Oracle.
Hat jemand eine Idee, wie man das schafft/erreicht?
Vielen Dank im Voraus!
Hier ist ein einfaches executeable Beispiel:
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDropEvent;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.List;
public class DragDropTest extends javax.swing.JFrame {
public DragDropTest() {
initComponents();
initDragAndDrop();
}
private void initDragAndDrop() {
this.setDropTarget(new DropTarget(){
@Override
public synchronized void drop(DropTargetDropEvent dtde) {
try {
Transferable transfer = dtde.getTransferable();
if(transfer.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
List objects = (List)transfer.getTransferData(DataFlavor.javaFileListFlavor);
for(Object object : objects) {
if(object instanceof File) {
File source = (File)object;
File dest = new File(System.getProperty("user.home")+File.separator+source.getName());
Files.copy(Paths.get(source.getAbsolutePath()), Paths.get(dest.getAbsolutePath()), StandardCopyOption.REPLACE_EXISTING);
System.out.println("File copied from "+source.getAbsolutePath()+" to "+dest.getAbsolutePath());
}
}
} else if(transfer.isDataFlavorSupported(DataFlavor.stringFlavor)) {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
String type = (String)transfer.getTransferData(DataFlavor.stringFlavor);
System.err.println("Data flavor not supported: "+type);
} else {
System.err.println("Data flavor not supported.");
}
} catch(UnsupportedFlavorException ex) {
System.err.println(ex.getMessage());
} catch(IOException ex) {
System.err.println(ex.getMessage());
} catch(Exception ex) {
System.err.println(ex.getMessage());
} finally {
dtde.dropComplete(true);
}
}
});
}
@SuppressWarnings("unchecked")
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Drag & Drop");
setResizable(false);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 200, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 200, Short.MAX_VALUE)
);
pack();
}
public static void main(String args[]) {
new DragDropTest().setVisible(true);
}
}
einen Schritt weiter gehen, um den Geschmack drucken Sie und versuchen, um es zu manipulieren, vielleicht alles in Datei zu speichern und dann zu sehen, was .eml ist, obwohl ich vermute, dass nur einer gesetzt wird. Wenn du nichts verwendbares bekommst, könnte ein Problem mit Thunderbird für * nix sein – tgkprog