4 Stimmen

Benötige Hilfe bei der Implementierung von Drag & Drop aus einer Java-Anwendung in das Native File System

Ich habe eine Java Swing-Anwendung, die eine Liste der Dateien/Ordner anzeigt, die auf den Server hochgeladen wurden. Ich habe die Anforderung, ausgewählte Dateien/Ordner per Drag and Drop in das native Dateisystem herunterzuladen. Ich habe nach Links gesucht, aber fast jeder Link beschreibt das Ziehen und Ablegen innerhalb einer Java Swing Anwendung. Meine Anforderung ist es, die Datei aus der Java Swing-Anwendung zu ziehen und sie im nativen Dateisystem abzulegen.

Ich brauche Hilfe, um zu wissen, wie ich den Ort, an dem der Benutzer die ausgewählte(n) Datei(en)/Ordner(n) im nativen Dateisystem abgelegt hat, ermitteln kann.

Nehmen wir zum Beispiel an, der Benutzer hat die Datei gezogen und direkt in den Bereich C:\Back_Up Ordner indem Sie das Fenster der Java-Anwendung wiederherstellen . Wie kann ich den Ort identifizieren, an dem der Benutzer die Datei abgelegt hat, d. h. C:\Back_Up ?

1voto

Andreas Dolk Punkte 110776

AFAIK, ist es nicht möglich, die Information zu erhalten, wo ein gezogenes Objekt abgelegt wurde. Ich vermute, Ihre Idee war, den Ablegepunkt zu kennen und die Datei in einem zweiten Schritt an diese Position zu kopieren.

Ich glaube aber, dass es so nicht funktioniert und, was noch schlimmer ist, dass das Ganze ziemlich betriebssystemabhängig sein könnte. Ich wette, Sie müssen die gesamte Datei auf die Übertragung setzen. Ich weiß, dass es möglich ist, mit SWT, aber SWT Schiffe mit einigen nativen Bibliotheken...

Hier ist zumindest ein Link, der ein Beispiel für den umgekehrten Weg zeigt: Ziehen und Ablegen einer Gruppe von Dateien in einer Baumstruktur

1voto

Ashish Pancholi Punkte 4449

Danke Andreas.. Wir haben eine JAVA-Komponente als Tabelle, aus der wir die Datei ziehen und im nativen Dateisystem ablegen. Wir haben Code wie

A> Komponente ist JXTree. Wir haben folgende Eigenschaft eingestellt, um Drag and Drop zu unterstützen.

Component.setDropMode(DropMode.INSERT); 

Component.setDragEnabled(true); 

DragSource ds = DragSource.getDefaultDragSource();

DragGestureRecognizer dgr = ds.createDefaultDragGestureRecognizer( Component,    
                 DnDConstants.ACTION_MOVE, new FileDragGestureListener());

B> Wir haben eine Klasse geschrieben, die Drag Gesture Listener implementiert.

public class FileDragGestureListener extends DragSourceAdapter implements DragGestureListener {

public void dragGestureRecognized(DragGestureEvent dge) {

 We get selected row from table.
 Download the selected File to Native file System's TEMP directory. 
FileSystemView fsv = FileSystemView.getFileSystemView();
Icon icn = fsv.getSystemIcon(File);
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension dim = tk.getBestCursorSize(icn.getIconWidth(), icn.getIconHeight());
BufferedImage buff = new BufferedImage(dim.width, dim.height,   
                                    BufferedImage.TYPE_INT_ARGB);
if (DragSource.isDragImageSupported()) {
            evt.startDrag(DragSource.DefaultCopyDrop, buff, new Point(0, 0),
                    new TextFileTransferable(File),
                    this);
        } else {
            cursor = tk.createCustomCursor(buff, new Point(0, 0), "sString");
            evt.startDrag(cursor, null, new Point(0, 0),
                    new TextFileTransferable(File),
                    this);
        }

}

class TextFileTransferable implements Transferable {

File temp;

public TextFileTransferable(File temp) throws IOException {

    this.temp = temp;
}

public Object getTransferData(DataFlavor flavor) {
     List list = new ArrayList();
    list.add(temp);
    return list;
}

public DataFlavor[] getTransferDataFlavors() {

    DataFlavor[] df = new DataFlavor[1];
    df[0] = DataFlavor.javaFileListFlavor;
    return df;
}

public boolean isDataFlavorSupported(DataFlavor flavor) {

    if (flavor == DataFlavor.javaFileListFlavor) {
        return true;
    }
    return false;
}

}

So können wir die Datei bis zu %TEMP% herunterladen und dann nicht an einen Ort verschieben, an dem sie abgelegt wurde.

Bitte schlagen Sie mir vor, wo ich falsch liege oder was der beste Ansatz ist, um dieses Drag and Drop zu implementieren.

Danke

0voto

Joonas Pulakka Punkte 35583

Ich glaube Java-Desktop-API könnte dies erreichen. Bei den Details bin ich mir allerdings nicht sicher...

0voto

mring Punkte 1669

Wenn Sie wüssten, in welchen Verzeichnissen die Leute etwas ablegen würden, könnte Ihre Anwendung vielleicht Datei-Objekte erstellen, die auf diese Verzeichnisse zeigen, und dann das Observer-Entwurfsmuster verwenden, um Ihrer Anwendung mitzuteilen, wenn etwas in diese Verzeichnisse abgelegt wurde (vielleicht durch Abfrage des Inhalts). Wenn andere Programme/Menschen etwas in diese Verzeichnisse ablegen, würden Sie auch darüber benachrichtigt werden, aber dann könnten Sie den Zeitpunkt, zu dem die Benachrichtigung eintrifft, mit dem Zeitpunkt vergleichen, zu dem Sie wissen, dass Sie etwas abgelegt haben. Dies würde den Fall auf den wohl unwahrscheinlichen (aber dennoch möglichen) Fall reduzieren, dass jemand anderes fast genau zur gleichen Zeit etwas in Verzeichnis A ablegt wie Sie in Verzeichnis B.

Viel Glück!

0voto

Ravi Gupta Punkte 4347

Einige Anhaltspunkte können von JDesktop Integration Components bezogen werden: https://jdic.dev.java.net/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X