Ich habe folgenden Code, der unter Windows wunderbar funktioniert, um Dateien von außerhalb in eine JTable zu draggen und dort die entsprechenden Einträge zu erzeugen:
Die relevanten Zeilen sind 29-46. Unter Windows geht das, wie gesagt, toll, unter Linux (gleiche .jar, JRE 1.5.0_06, Suse Linux 10) passiert gar nichts (nicht mal eine Exception oder so).
Nur eine Anmerkung: Interessanterweise kann man in das darüberliegende Textfeld nur unter Linux eine Datei ziehen, um den Dateinamen in das Textfeld einzutragen, aber das hab ich eh net selber geschrieben
Und noch eine: gleiches gilt übrigens auch für einen woanders vorkommenden JTree, wo dafür derselbe Code verwendet wird.
Code:
package de.illu.xjc;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.*;
import java.io.File;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class ProjectCreatorTable extends JTable implements DropTargetListener
{
public ProjectCreatorTable(DefaultTableModel tm, JScrollPane dropTarget)
{
super(tm);
new DropTarget(dropTarget, this);
}
// Drop things
public void drop(DropTargetDropEvent evt)
{
try {
Transferable t = evt.getTransferable();
if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
if ((evt.getSourceActions() & DnDConstants.ACTION_COPY) == 0) {
evt.rejectDrop();
} else {
evt.acceptDrop(DnDConstants.ACTION_COPY);
DataFlavor[] currentFlavors = evt.getCurrentDataFlavors(); //mögliche Datentypen herausfinden
DataFlavor selectedFlavor = null;
for (DataFlavor df : currentFlavors) { //ohne diese Schleife funktioniert das merkwürdigerweise (auch unter Windows) nicht
if (DataFlavor.javaFileListFlavor.equals(df)) {
selectedFlavor = df;
break;
}
}
if (selectedFlavor != null) { //dnd möglich
@SuppressWarnings("unchecked")
java.util.List<File> list = (java.util.List<File>) t
.getTransferData(selectedFlavor);
for (File f : list) {
((DefaultTableModel) getModel())
.addRow(new Object[] { f, "/", "" });
}
}
}
} else {
evt.rejectDrop();
}
} catch (Exception ex) {
ex.printStackTrace();
evt.rejectDrop();
}
}
public void dragEnter(DropTargetDragEvent evt)
{
// Called when the user is dragging and enters this drop target.
}
public void dragOver(DropTargetDragEvent evt)
{
}
public void dragExit(DropTargetEvent evt)
{
// Called when the user is dragging and leaves this drop target.
}
public void dropActionChanged(DropTargetDragEvent evt)
{
// Called when the user changes the drag action between copy or move.
}
}
Die relevanten Zeilen sind 29-46. Unter Windows geht das, wie gesagt, toll, unter Linux (gleiche .jar, JRE 1.5.0_06, Suse Linux 10) passiert gar nichts (nicht mal eine Exception oder so).
Nur eine Anmerkung: Interessanterweise kann man in das darüberliegende Textfeld nur unter Linux eine Datei ziehen, um den Dateinamen in das Textfeld einzutragen, aber das hab ich eh net selber geschrieben
Und noch eine: gleiches gilt übrigens auch für einen woanders vorkommenden JTree, wo dafür derselbe Code verwendet wird.