# JTree Problem: Null Child not allowed



## Guest (4. Feb 2009)

Hey!

Ich baue mein TreeModel anhand von Datenbank Objekten über Hibernate auf.
Lösche ich nun eines dieser Hibernate Objekte, schmeißt der Baum folgende Exception:


> Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Null child not allowed
> at javax.swing.tree.TreePath.pathByAddingChild(TreePath.java:259)
> at javax.swing.plaf.basic.BasicTreeUI.getLastChildPath(BasicTreeUI.java:1672)
> at javax.swing.plaf.basic.BasicTreeUI.paintVerticalPartOfLeg(BasicTreeUI.java:1391)
> ...



Ich gehe davon aus, dass der Baum das löschen des Objektes mit bekommt und in der Methode pathByAddingChild versucht auf eben dieses gelöschte Objekt zuzugreifen.

Kann mir jemand verraten wie ich das umgehen / verhindern kann?
Kann nach dem löschen der Objekte die Oberfläche nur abschießen, da sie ansonsten ncht mehr gezichnet wird.

Hoffe jmd. weiß Rat!

Danke und Gruß
Mark


----------



## Wildcard (4. Feb 2009)

Wie propagierst du die Events im TableModel? Synchronisierst du auch die Threads?


----------



## Gast (4. Feb 2009)

Hey,

TableModel? Threads?

Ich drücke auf den "Löschen" Knopf, erkenne welche Objekte bzw. welches Objekt markiert ist und lösche diese über deren DAOs.

Im Anschluss an das löschen rufe ich meinen eigenen Code auf zum Baum Neuzeichnen. Die Exception die ich oben gepostet habe tritt allerdings schon vorher auf ...


----------



## Wildcard (4. Feb 2009)

Wenn dein TableModel den Listener Support korrekt implementiert und dem JTree bescheid sagt, brauchst du nicht händisch neu zeichnen.


----------



## Ebenius (4. Feb 2009)

Wildcard, verwechselst Du hier das TreeModel mit dem TableModel?

Gast, wie sieht denn Dein TreeModel aus?


----------



## Wildcard (4. Feb 2009)

Ebenius hat gesagt.:
			
		

> Wildcard, verwechselst Du hier das TreeModel mit dem TableModel?


Kann man so sagen. Keine Ahnung wie ich jetzt auf die Table komme  :lol:


----------



## Ariol (4. Feb 2009)

Wie löscht du denn?


----------



## Guest (5. Feb 2009)

Ariol hat gesagt.:
			
		

> Wie löscht du denn?



Ich lösche die Elemente über deren DAOs in der Datenbank.

Tree Model (wenn bestimmte methoden benötigt werden für analyse liefer ich die nach!)

```
public class MyTreeModel extends FilterableTreeModel implements TreeModel
{
	private Vector<TreeModelListener> mListener = new Vector<TreeModelListener>();
	
	@Override
	public void addTreeModelListener(TreeModelListener pL)
	{
		mListener.add(pL);
	}

	@Override
	public Object getChild(Object pParent, int pIndex)
	{
		...
	}

	@Override
	public int getChildCount(Object pParent)
	{
		
		...
	}

	@Override
	public int getIndexOfChild(Object pParent, Object pChild)
	{
		
		...
	}

	@Override
	public Object getRoot()
	{
		...
	}

	@Override
	public boolean isLeaf(Object pNode)
	{
		...
	}

	@Override
	public void removeTreeModelListener(TreeModelListener pL)
	{
	}

	@Override
	public void valueForPathChanged(TreePath pPath, Object pNewValue)
	{
	}

}
```

FilterableTreeModel ist eine Componente der JideComponents.


----------



## Ebenius (5. Feb 2009)

Also: Der JTree (wie alle Swing-Komponenten) erwartet, dass man ihm Bescheid gibt, wenn sich die Daten verändern. Wird also ein Datum gelöscht, muss das Modell allen seinen Zuhörern (z.B. dem Baum) Bescheid geben, über die TreeModelListener.treeNodesRemoved(TreeModelEvent)-Methode. Löschst Du nur die Daten und/oder Knoten ohne dem Baum Bescheid zu sagen, wird dieser rumzicken. Und zwar zu recht. 

Ein bisschen Information gibts im Sun Tutorial: How to Use Trees »» Creating a Data Model.

Ebenius


----------



## Gast (6. Feb 2009)

Hmm hat mir jetzt ehrlichegsagt auch nicht so viel weitergeholfen der Link (oder ich überseh irgendwas wichtiges)

Ich will die Daten ja aus der Datenbank löschen und dann dem Tree sagen: "Hey, jetzt bitte aktualisieren weil die Daten haben sich geändert" - nur, bevor ich an die Stelle komme, schmeist er ja schon selber die Exception :-/


----------



## Ebenius (6. Feb 2009)

Anonymous hat gesagt.:
			
		

> Ich will die Daten ja aus der Datenbank löschen und dann dem Tree sagen: "Hey, jetzt bitte aktualisieren weil die Daten haben sich geändert" - nur, bevor ich an die Stelle komme, schmeist er ja schon selber die Exception :-/


Das Baum-Modell muss zu jeder Zeit aktuelle Daten haben. Also in etwa so ein Aufbau: 
User klickt auf Löschen
Knoten aus dem Baum nehmen
Datenobjekt löschen
Anders geht das nunmal nicht. Der Link oben hilft, wenn Du ein eigenes Modell implementieren wolltest. Den initialen Aufwand sollte man aber nicht unterschätzen.

Ebenius


----------



## Gast (10. Feb 2009)

Hallo Ebenius,

wie sollte man denn die Struktur aufbauen, wenn man seinen Baum direkt mit Objekte aus der Datenbank befüllen möchte?

Sollte man diesen Objekten direkt das Interface für Treenodes mitgeben um so das löschen etc. evtl. zu vereinfachen oder sollte man spezielle Treenodes schreiben, die letztendlich wissen für welches Objekt  sie in der datenbank stehen?


----------



## Ebenius (10. Feb 2009)

Anonymous hat gesagt.:
			
		

> Sollte man diesen Objekten direkt das Interface für Treenodes mitgeben um so das löschen etc. evtl. zu vereinfachen oder sollte man spezielle Treenodes schreiben, die letztendlich wissen für welches Objekt  sie in der datenbank stehen?


Würde ich nicht tun. Ich würde mir meine eigene TreeModel-Implementierung bauen. Allerdings muss man genau aufpassen, welche Events man in welchem Fall senden muss. Die TreeUI-Implementationen verzeihen da keine Fehler.

Viel Erfolg,
Ebenius


----------

