Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo,
wie wir hier (www.java-forum.org/) schon geklärt haben kann ich jetzt eine jList mit eigenen Objekten befüllen.
Aus dieser Liste sollen jetzt Einträge per Drag n Drop in eine andere Liste kopiert werden können.
Hinterher benötige ich aus der 2. Liste einige Details zu den Einträgen.
Am Besten wäre es wenn ich die 2. Liste durchgehen könnte und mit getElementAt(x) mein Object wiederbekomme.
Ich hoffe ich habe verständlich beschrieben was ich vorhabe.
Als 2. lösungsansatz habe ich auch schon parallel nebenher ein array genau wie die 1.Liste befüllt.
Wenn ich jetzt beim Drag und Drop wüsste welcher eintrag an welche stelle der 2. Liste kopiert wird, könnte ich mein objekt im hintergrund in den array hin und her kopieren.
Ich habe ganz ehrlich keine Ahnung, was du mit "Einträge per Drag n Drop in eine andere Liste kopiert werden" meinst, da das meiner Meinung nach bedeuten würde, dass du dir eine grafische Umgebung mit Mausabfragen aufbauen willst, in der du Arrays kopierst. (meiner Meinung nach totaler Unfug)
Aber ich hoffe einfach mal du meinst etwas anderes und formulierst deine Frage noch einmal verständlicher und detailierter .
also ich habe 2 Listen
in der ersten liste sind ganz viele einträge. Die einträge füge mich mit addElement(meinObjekt) hinzu.
Wenn einige dieser einträge jetzt in eine andere Liste kopiert werden möchte ich nicht nur den String wie der eintrag in der 1. Liste heißt abfangen können, sondern "meinobjekt", da dort noch andere wichtige informationen gespeichert sind.
ok gut
ich habe das "ListTransferHandler" beispiel von der Java Seite als grundgerüst genommen.
wo kann ich dann mein Objekt abfangen?
ich habe allerdings auch schon probiert einfach erst mein Objekt zu einer Liste hinzufügen und dann sofort wieder auslesen. Selbst da habe ich nur den String bekommen.
Bei dem Beispiel von der Seite wird die gesamte Auswahl in ein "StringSelection" gepackt (schließlich soll das ganze dann als String in eine TextArea eingefügt werden). Wenn du dort eigene Objekte transferen willst, musst du wohl eine eigene Implementierung von Transferable erstellen....
wie müsste ich denn eine eigene Implementierung von Transferable anstellen?
sonst hätt ich jetzt einfach alles was ich beim drag n drop bekomme direkt in ein array gespeichert und in der 2. liste nur eine Übersicht mit strings angezeigt. wäre aber schöner wenn ich das mit dem transferable machen könnte.
Du musst nur die drei Methoden aus "Transferable" implementieren. Bei getTransferData gibst du dein Objekt zurück. Für den DataFlavor reicht wohl erstmal irgendein einzlener (eigener) DataFlavor
Ein bißchen Code posten "Das hab' ich bisher" ... und eine konkretere Frage dazu als "Wie geht das?" ... wäre nicht verkehrt. Aber.... ich stimme deiner durch die Frage implizit gemachten :wink: Aussage zu: Drag&Drop und Data Transfer ist nicht sooo trivial (wie andere Sachen in Swing). Man hat unglaublich viele Möglichkeiten, und es ist schwer, genau DIE "rauszufischen", die man gerade braucht. (Einige "Vereinfachungen" (innere Klassen von TransferHandler) sind auch erst in Java 1.6 dazugekommen, und daher nur bedingt empfehlenswert).
Ich hab' mal versucht, prototypisch und als "Basis" das zu machen, was du vorhast. Das Programm erlaubt es, Objekte vom Typ "SomeClass" von einer Liste in die andere zu verschieben. Wenn die Zeile
m0.removeElement(someClass);
auskommentiert ist, werden die Referenzen kopiert, aber das ist schon eines der vielen Details, über die man sich noch Gedanken machen müßte: Sollen sie kopiert oder verschoben werden? Oder soll die "übliche" Funktionalität (Drag=Bewegen, STRG+Drag=Kopieren) vorhanden sein? Aber dazu kannst du dir mal http://java.sun.com/j2se/1.5.0/docs/guide/swing/1.4/dnd.html und http://java.sun.com/docs/books/tutorial/uiswing/dnd/intro.html durchlesen.
Code:
// By Marco13 for [url]http://www.java-forum.org/de/viewtopic.php?t=69940&postdays=0&postorder=asc&start=0[/url]
import javax.swing.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.*;
class SomeClass
{
private int value = (int)(Math.random()*100);
public int getValue()
{
return value;
}
public String toString()
{
return "SomeClass "+value;
}
}
class DragAndDropTest extends JFrame
{
public static void main(String args[])
{
new DragAndDropTest();
}
public DragAndDropTest()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(new GridLayout(1,2));
final DefaultListModel m0 = new DefaultListModel();
m0.addElement(new SomeClass());
m0.addElement(new SomeClass());
m0.addElement(new SomeClass());
m0.addElement(new SomeClass());
m0.addElement(new SomeClass());
final JList l0 = new JList(m0);
DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(
l0, DnDConstants.ACTION_MOVE, new DragGestureListener()
{
public void dragGestureRecognized(DragGestureEvent e)
{
SomeClass someClass = (SomeClass)l0.getSelectedValue();
Transferable transferable = new TransferableSomeClass(someClass);
e.startDrag(DragSource.DefaultMoveDrop, transferable);
}
}
);
getContentPane().add(l0);
final DefaultListModel m1 = new DefaultListModel();
final JList l1 = new JList(m1);
getContentPane().add(l1);
l1.setDropTarget(new DropTarget(l1, new DropTargetAdapter()
{
public void drop(DropTargetDropEvent dtde)
{
try
{
SomeClass someClass = (SomeClass)dtde.getTransferable().getTransferData(someClassFlavor);
m0.removeElement(someClass);
m1.addElement(someClass);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}));
pack();
setVisible(true);
}
private static DataFlavor someClassFlavor = new DataFlavor(SomeClass.class, SomeClass.class.getSimpleName());
class TransferableSomeClass implements Transferable
{
private SomeClass transferredObject;
public TransferableSomeClass(SomeClass transferredObject)
{
this.transferredObject = transferredObject;
}
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException
{
if (!flavor.equals(someClassFlavor))
{
throw new UnsupportedFlavorException(flavor);
}
return transferredObject;
}
public DataFlavor[] getTransferDataFlavors()
{
return new DataFlavor[]{ someClassFlavor };
}
public boolean isDataFlavorSupported(DataFlavor flavor)
{
return flavor.equals(someClassFlavor);
}
}
}
Es könnte vielleicht sogar sein, dass der Aufwand mit DragGestureRecognizer und Transferable umgangen werden könnte, da du ja nicht mit Copy&Paste arbeitest, oder von/zu anderen Programmen Draggen/Droppen willst, aber ... das ist wohl jetzt erstmal egal.
Wenn man die "magischen 10 Zeilen" für DragSource und DropTarget kennt, ist's zumindest nichtmehr viel, aber ... wenn's dann darum geht, z.B. "SomeClass"-Objekte ODER "SomeOtherClass"-Objekte zu draggen, droppen, kopieren, verschieben, copy&pasten oder aus dem Windows-Explorer ins eigene Programm zu ziehen kann's halt schon schnell richtig kompliziert werden....