Nightshifter
Grünschnabel
Hallo allerseits,
es gibt zwar schon hunderte DND Threads aber keiner beantwortet mein folgendes Problem:
Ich habe eine GUI mit einem Graphen (Jung 2.0.1 mit Swing) auf der rechten und einem Tree (SWT) auf der linken Seite.
Der Tree enthält mehrere Items mit "Element" als Data Objekt. Die Element Objekte werden mit Hibernate aus einer Datenbank ausgelesen und haben dementsprechend (weil Tree) "parent" und "child" Attribute. Außerdem stehen sie untereinander auch noch in einer Beziehung, die ich hier mal Abhängigkeit(en) nennen möchte.
Der Graph ist vorerst leer und ich möchte per DND Elemente aus dem Tree hinein ziehen. Wenn ein Element A dem Graphen hinzugefügt wird, werden alle anderen Elemente, die mit diesem Element A in Verbingung stehen ebenfalls hinzugefügt und durch Kanten dementsprechend verbunden.
Meine aktuelle Lösung sieht in etwa wie folgt aus:
Beim Drag wird die Id bzw. die Ids der slektieren Items als String mit Semikolons getrennt übergeben (ID = Primärschlüssel). Beim Drop wird der String dann wieder gesplittet und jedes Element anhand der ID aus der Datenbank ausgelesen und dem Graphen hinzugefügt.
Frage: gibt es eine bessere / elegantere Lösung? Wie ist das mit einem eigenen TransferType bei komplexen Objekten wie meinem "Element" Objekt, welches n Kinder und n Abhängige Objekte etc. haben kann? Natürlich könnte man auch beim Drag die selektierten Elemente in ein Singleton schreiben und beim Drop dann raus holen (dann spart man sich den Datenbankzugriff), aber das ist ja auch irgendwie halbherzig.
Mir ist bewusst, dass ich keinen eigenen TransferType benötige, wenn ich Objekte nicht Anwendungsübergreifend Draggen will, aber die Lösung mit dem String kommt mir nicht sonderlich schön vor.
Wen es interessiert hier mein SourceAdapter (Tree) und DropTarget(Graph):
es gibt zwar schon hunderte DND Threads aber keiner beantwortet mein folgendes Problem:
Ich habe eine GUI mit einem Graphen (Jung 2.0.1 mit Swing) auf der rechten und einem Tree (SWT) auf der linken Seite.
Der Tree enthält mehrere Items mit "Element" als Data Objekt. Die Element Objekte werden mit Hibernate aus einer Datenbank ausgelesen und haben dementsprechend (weil Tree) "parent" und "child" Attribute. Außerdem stehen sie untereinander auch noch in einer Beziehung, die ich hier mal Abhängigkeit(en) nennen möchte.
Der Graph ist vorerst leer und ich möchte per DND Elemente aus dem Tree hinein ziehen. Wenn ein Element A dem Graphen hinzugefügt wird, werden alle anderen Elemente, die mit diesem Element A in Verbingung stehen ebenfalls hinzugefügt und durch Kanten dementsprechend verbunden.
Meine aktuelle Lösung sieht in etwa wie folgt aus:
Beim Drag wird die Id bzw. die Ids der slektieren Items als String mit Semikolons getrennt übergeben (ID = Primärschlüssel). Beim Drop wird der String dann wieder gesplittet und jedes Element anhand der ID aus der Datenbank ausgelesen und dem Graphen hinzugefügt.
Frage: gibt es eine bessere / elegantere Lösung? Wie ist das mit einem eigenen TransferType bei komplexen Objekten wie meinem "Element" Objekt, welches n Kinder und n Abhängige Objekte etc. haben kann? Natürlich könnte man auch beim Drag die selektierten Elemente in ein Singleton schreiben und beim Drop dann raus holen (dann spart man sich den Datenbankzugriff), aber das ist ja auch irgendwie halbherzig.
Mir ist bewusst, dass ich keinen eigenen TransferType benötige, wenn ich Objekte nicht Anwendungsübergreifend Draggen will, aber die Lösung mit dem String kommt mir nicht sonderlich schön vor.
Wen es interessiert hier mein SourceAdapter (Tree) und DropTarget(Graph):
Java:
public class TreeSourceAdapter extends DragSourceAdapter
{
TreeItem[] dragSourceItems = null;
Tree tree;
public TreeSourceAdapter(Tree tree)
{
super();
this.tree = tree;
}
public void dragStart(DragSourceEvent event)
{
TreeItem[] selection = tree.getSelection();
if (selection.length > 0)
{
event.doit = true;
dragSourceItems = selection;
}
else
{
event.doit = false;
}
}
public void dragSetData(DragSourceEvent event)
{
String ids = "";
for (TreeItem treeItem : dragSourceItems)
{
Element e = (Element) treeItem.getData();
String id = String.valueOf(e.getId());
if (ids.equals(""))
{
ids += id;
}
else
{
ids += ";" + id;
}
}
event.data = ids;
}
public void dragFinished(DragSourceEvent event)
{
dragSourceItems = null;
}
}
Java:
public void drop(DropTargetDropEvent dtde)
{
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
String o = null;
try
{
o = (String)dtde.getTransferable().getTransferData(DataFlavor.stringFlavor);
}
catch (Exception ex)
{
}
String[] ids = o.split(";");
DaoFactory daoFactory = new DaoFactory();
ElementDao dao = daoFactory.getElementDao();
for (String idString : ids)
{
Long id = Long.valueOf(idString);
Element e = dao.getById(id);
graph.addElement(e);
}
}