JTree reseten und aus DB neu laden

gigagon

Mitglied
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:

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
 
Hallo,

ich glaube, nachdem du das neue Objekt in das Model eingefügt hast, musst du das Model im Tree wieder aktualisieren (mit tree.setModel(treeModel)), sonst kriegt der Baum die Änderungen nicht mit. Wenn das alleine nicht hilft, würde ich danach mit tree.repaint() oder tree.updateUI() versuchen, damit der Baum sein neues Model auch rendert. Auf das komplette Neuladen des Baumes (mit resetTreeModel()) würde ich erstmal verzichten: es sollte auch ohne gehen.

Grüße
Vincent
 
Oh Vincentius,
du bist mein Retter :)

Anscheint hab ich den Wald vor lauter Bäumen nicht gesehen und die Möglichkeit das TreeModel neu zu setzen überhaupt nicht wahrgenommen, jedenfalls nicht auf diese einfache Weise :eek: mit
tree.setModel(treeModel));
tree.repaint();

Hab meine buildTree() Funktion etwas angepasst und es funktioniert super.

Danke und schön Tag noch

MfG
 

Neue Beiträge

Zurück