Drop-Funktion auf JFrame für Dateityp

Jellysheep

Erfahrenes Mitglied
Hi,
ich möchte einen JFrame anzeigen, auf dem nur ein bestimmter Dateityp abgelegt werden kann.
Diesen Code habe ich ausprobiert, es wird dort aber alles akzeptiert, sogar nur Text.
Wie kann ich hier nur einen bestimmten Dateityp, z.B. *.java, erlauben?
 
Hallo Jellysheep,
dasselbe Problem hatte ich auch. Versuch doch, deinem JFrame einen TransferHandler, den du selbst erweiterst, zu setzen.

Das Listenerinterface:
Java:
//imports
public interface MyListener
{
public abstract void rightFilesDropped(Object source, File file);
}

Die "Dropklasse":
Java:
//imports
public class MyDropClass extends TransferHandler
{
Object surface;
MyListener listener;

public MyDropClass (Object surface, MyListener listener)
{
this.surface = surface;
this.listener = listener;
}

@SuppressWarnings("unchecked") //compiler may complain without this annotation
public boolean canImport(TransferSupport support)
{
File[] f = (File[]) ((List<File>)support.getTransferable().getTransferData(DataFlavor.javaFileListFlavor)).toArray();
if(f.length== 1) // falls nur eine Datei "gedroppt" werden darf, ansonsten musst du den Code entsprechend abändern
{
return f[0].getName().endsWith(".java");
}
return false;
}

@SuppressWarnings("unchecked") //compiler may complain without this annotation
public boolean importData(TransferSupport support)
{
File[] file = (File[]) ((List<File>)support.getTransferable().getTransferData(DataFlavor.javaFileListFlavor)).toArray();
listener.rightFileDropped(source, file[0]);
}

Die Klasse mit dem Frame:
Java:
//imports
public class MyFrame extends JFrame implements MyListener
{
public MyFrame()
{
setTransferHandler(new MyTransferHandler(this, this); // args: the surface, the listener
}

public void rightFilesDropped(File[] f)
{
//hier Behandlung der Dateien (nur die ".java"-Dateien werden übergeben)
}

Ich hoffe, es ist nicht zu kompliziert geworden und ich konnte dir ausreichend helfen.
grüße,
kevin
 
Vielen Dank! ;)
Das ist genau das, was ich meinte!
Leider wird bei mir beim erfolgreichen "droppen" diese Exception geworfen:
java.awt.dnd.InvalidDnDOperationException: No drop current
Wie kann ich das verhindern?
Bei Google habe ich gefunden, dass ich diesen Code einfügen soll:
Java:
event.acceptDrop(DragNDropConstants.ACTION_COPY_OR_MOVE);
Aber wo und für welches event-Objekt?
 
Hallo Jellysheep,
Entschuldigung für die verspätete Antwort...
Tatsächlich wird diese Exception bei mir auch geworfen. Jedoch klappt der "Dateidrop" trotzdem problemlos, denn die Exception wird nur geworfen, wenn die canImport(TransferSupport)-Methode beim Drop aufgerufen wird, da der Drop noch leer ist.
Die Anweisung
Java:
File[] file = (File[]) ((List<File>)support.getTransferable().getTransferData(DataFlavor.javaFileListFlavor)).toArray();
von der canImport(TransferSupport)-Methode (nicht von importData(TransferSupport)) wirft diese Exception, welche problemlos aufgefangen werden kann:
Java:
public boolean canImport(TransferSupport support)
{
try
{
File[] file = (File[]) ((List<File>)support.getTransferable().getTransferData(DataFlavor.javaFileListFlavor)).toArray();
}
catch(InvalidDnDOperationException ex)
{
//empty!!
}

//other code
}

Ach ja:
In der canImport(TransferSupport)-Methode solltest du noch mit der Anweisung
Java:
public boolean canImport(TransferSupport support)
{
if(!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor))// <=
return false;// <=

//other code
}
am Anfang überprüfen, ob das jeweilige System "Dateidrops" unterstützt. Also falls die Methode false zurückgibt, sollte canImport(TransferSupport) auch false zurückgeben, um so dem User zu signalisieren, dass "droppen" nicht möglich ist.

grüße,
kevin
 
Hallo,

noch eine kleine Info nebenbei. Wenn das Programm auch unter Linux und Mac OS laufen soll, solltest du es dort nochmal testen. Es sollte so nämlich dort nicht funktionieren. Bei Linux wird nämlich ein String(Pfad der Datei) gedroppt und das fällt nicht unter DataFlavor.javaFileListFlavor. Nur unter Windows werden dort Dateien erkannt.

Gruß

Sascha
 
Zurück