Guten Tag liebe Java-Freunde,
ich hab schon seit längeren ein Problem, was ich bis jetzt nicht lösen konnte. Google und Co haben zwar einige Ergebnisse geliefert, aber keines konnte mein Problem lösen.
Das Problem ist folgendes:
Ich habe zwei JTrees und zwar eines für Kategorien und eines für Container.
Kategorien können Unter-Kategorein haben und Container Unter-Container.
Beide Arten enthalten als Blätter Objekte (eigene Datenklasse).
Alles wird in einer Datenbank gespeichert und zwar sofort, wenn etwas neu angelegt wurde.
Ich verwende lazyloading und ein eigenes TreeModel.
(Standard ist, dass der Baum bis auf die erste Ebene zusammengeklappt ist)
Das Problem tritt auf, wenn ich z.B. ein Objekt im Containerbaum einfüge (mit in einem Dropdown-Menü ausgewählter Kategorie) fügt es diesen ohne Probleme in den Containerbaum ein, aber natürlich nicht in den Kategorie-Baum.
Jetzt würde ich gerne den Kategorie-Baum über ein Button neu laden.
Dabei kann sich der aufgeklappte Baum auch wieder in die Grundposition begeben, Hauptsache die Daten werden komplett beim erneuten aufklappen geladen.
Alles andere, wie das Laden und einfügen neuer Objekte und Knoten funktioniert super.
Ich habe schon versucht das TreeModel auf null zu setzen aber nichts habt funktioniert.
Der Baum bleibt, wie er ist und zwar ausgeklappt und komplett.
Erstmal habe ich versucht ihn bis auf Root zurück zu setzen, auch das funktioniert nicht:
Ich hoffe ihr versteht mein Problem und habt evtl. die eine oder andere Idee, die mich weiterbringen könnte.
MfG
ich hab schon seit längeren ein Problem, was ich bis jetzt nicht lösen konnte. Google und Co haben zwar einige Ergebnisse geliefert, aber keines konnte mein Problem lösen.
Das Problem ist folgendes:
Ich habe zwei JTrees und zwar eines für Kategorien und eines für Container.
Kategorien können Unter-Kategorein haben und Container Unter-Container.
Beide Arten enthalten als Blätter Objekte (eigene Datenklasse).
Alles wird in einer Datenbank gespeichert und zwar sofort, wenn etwas neu angelegt wurde.
Ich verwende lazyloading und ein eigenes TreeModel.
(Standard ist, dass der Baum bis auf die erste Ebene zusammengeklappt ist)
Das Problem tritt auf, wenn ich z.B. ein Objekt im Containerbaum einfüge (mit in einem Dropdown-Menü ausgewählter Kategorie) fügt es diesen ohne Probleme in den Containerbaum ein, aber natürlich nicht in den Kategorie-Baum.
Jetzt würde ich gerne den Kategorie-Baum über ein Button neu laden.
Dabei kann sich der aufgeklappte Baum auch wieder in die Grundposition begeben, Hauptsache die Daten werden komplett beim erneuten aufklappen geladen.
Alles andere, wie das Laden und einfügen neuer Objekte und Knoten funktioniert super.
Ich habe schon versucht das TreeModel auf null zu setzen aber nichts habt funktioniert.
Der Baum bleibt, wie er ist und zwar ausgeklappt und komplett.

Erstmal habe ich versucht ihn bis auf Root zurück zu setzen, auch das funktioniert nicht:
Java:
public class XContainerTree {
private final static Logger log = Logger.getLogger( XContainerTree.class );
private static Container container;
private static DefaultMutableTreeNode rootNode;
private static JTree tree;
private static XTreeModel treeModel;
private static HashSet<Long> containerTreeSet = new HashSet<Long>();
private static HashSet<Long> objectTreeSet = new HashSet<Long>();
public XContainerTree(Container container) {
container = container;
int width = container.getWidth()-10;
int height = container.getHeight()-10;
tree = buildTree(true);
JScrollPane treeScrollPane = new JScrollPane(tree);
treeScrollPane.setPreferredSize(new Dimension(width, height));
container.add(treeScrollPane);
if(log.isInfoEnabled()) {
log.info("ContainerTree initialized");
}
}
private static JTree buildTree(boolean root) {
rootNode = new DefaultMutableTreeNode(XLangManager.getString("tree_container_title")); // RootKnoten / Wurzel
treeModel = new XTreeModel(rootNode);
// Tree erzeugen und konfigurieren
JTree tree = new JTree(treeModel);
tree.setEditable(false);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.setShowsRootHandles(false);
tree.setDragEnabled(true);
tree.setDropMode(DropMode.USE_SELECTION);
tree.setDropTarget(new DropTarget(tree, TransferHandler.MOVE, new TreeDropAdapter(tree, container, objectTreeSet, containerTreeSet, null)));
treeModel.addTreeModelListener(new XContainerTreeAdapter(tree, container, objectTreeSet, containerTreeSet));
tree.addTreeWillExpandListener(new XContainerTreeAdapter(tree, objectTreeSet, containerTreeSet));
tree.addMouseListener(new XContainerTreeAdapter(tree, objectTreeSet, containerTreeSet));
if(root) {
loadRootContainer(rootNode); // Erste Reihe laden
}
return tree;
}
public static void loadRootContainer(DefaultMutableTreeNode parentNode) {
DefaultMutableTreeNode node = null;
XContainer[] parentContainerList = null;
XObject[] objects = null;
//lade alle Root-Container
if(!containerTreeSet.contains(-1L)) { // verhinder das Doppelte Laden
containerTreeSet.add(-1L);
parentContainerList = XContainerDAO.getRootContainer();
for(int i = 0; i < parentContainerList.length; i++) {
node = addObject(parentNode, parentContainerList[i], false); // Knoten [count] einfügen
try {
objects = XObjectDAO.getObjectsInThisContainer(parentContainerList[i]); // Objecte für diesen Container suchen
} catch (XApplicationUsageException e) {
}
if(objects != null){ // Wenn es Objecte gibt
for(int x = 0; x < objects.length; x++) { // Alle einfügen
if(!objectTreeSet.contains(objects[x].getId())) { // prüfen ob schon vorhanden
objectTreeSet.add(objects[x].getId()); // Set hinzufügen
addObject(node, objects[x], false); // leaf einfügen
}
}
}
}
}
}
private static DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent, Object child, boolean shouldBeVisible) {
DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(child);
treeModel.insertNodeInto(childNode, parent, parent.getChildCount());
//Make sure the user can see the lovely new node.
if (shouldBeVisible) {
tree.scrollPathToVisible(new TreePath(childNode.getPath()));
}
return childNode;
}
public static void resetTreeModel() {
containerTreeSet = new HashSet<Long>();
objectTreeSet = new HashSet<Long>();
tree = null;
treeModel = null;
tree = buildTree(false);
tree.repaint();
}
Ich hoffe ihr versteht mein Problem und habt evtl. die eine oder andere Idee, die mich weiterbringen könnte.
MfG