Hallo zusammen
ich habe ein wenig probleme mit meinem JTree. Kurz zur Situation:
Mein JTree ist dazu da, einen bestimmten Datensatz aus einer Collection in meinem Controller auszuwählen. Dazu habe ich ein eigenes TreeModel geschrieben:
In meinem Programm kann man auf ausgewählte Datensätze verschiedene Aktionen ausführen, so z.B. "Datensatz löschen". Wird ein Datensatz gelöscht, wird er im controller aus der collection geschmissen, aus der Datenbank gelöscht sowie, falls dieser Datensatz der aktuell selektierte war, der aktuell selektierte Datensatz auf null gesetzt. Nun werden alle DatenObserver benachrichtigt (wie z.B. mein JTree)
Soweit so gut, nun zum Problem.
Wähle ich in meinem JTree einen Datensatz aus, und lösche diesen, wird der Controller aufgerufen, dieser löscht den Datensatz und benachrichtigt wieder meinen JTree, sich zu aktualisieren. Aus irgendeinem Grund wird von meinem JTree jedoch noch bevor ich diesen neu aktualisieren kann, ein TreeSelectionEvent ausgelöst. Bei einem solchen Event, wird versucht im Controller der aktuelle Datensatz zu setzen. Da es jedoch nicht erlaubt ist, einen nichtvorhandenen Datensatz als den aktuellen Datensatz zu setzen werfe ich eine Exception.
Kann mir nun vielleicht irgendjemand erklären, weshalb vom JTree ein selection event ausgelöst wird, und zwar mit dem Datensatz den es ja gar nicht mehr gibt (und den natürlich auch vom TreeModel gar nicht mehr geliefert wird).
Bin für alle Informationen dankbar!
Grüsse gegel
ich habe ein wenig probleme mit meinem JTree. Kurz zur Situation:
Mein JTree ist dazu da, einen bestimmten Datensatz aus einer Collection in meinem Controller auszuwählen. Dazu habe ich ein eigenes TreeModel geschrieben:
Code:
class CategoryTreeModel implements TreeModel {
private CategoryController categoryController;
private Category root;
private Vector<TreeModelListener> treeModelListeners;
public CategoryTreeModel(CategoryController _controller) {
categoryController = _controller;
treeModelListeners = new Vector<TreeModelListener>();
try {
init();
} catch(Exception e) {
Log.exc(getClass(), e);
}
}
private void init() throws Exception {
root = new Category(-1, "Root", -1);
}
protected void fireTreeStructureChanged(Category _category) {
int len = treeModelListeners.size();
TreeModelEvent e = new TreeModelEvent(this,
new Object[] {_category});
for (int i = 0; i < len; i++) {
((TreeModelListener) treeModelListeners.elementAt(i)).
treeStructureChanged(e);
}
}
public Object getRoot() {
return root;
}
public Object getChild(Object parent, int index) {
Vector<Category> children = categoryController.getChildren(((Category)parent).getId());
return children.get(index);
}
public int getChildCount(Object parent) {
Category c = (Category)(parent);
return categoryController.getChildren(c.getId()).size();
}
public boolean isLeaf(Object node) {
return false;
}
public void valueForPathChanged(TreePath path, Object newValue) {
Log.debug(getClass(), "Value for path changed, path:"+path+"; new value:"+newValue);
}
public int getIndexOfChild(Object parent, Object child) {
Category c = (Category)parent;
Vector<Category> v = categoryController.getChildren(c.getId());
for(int i=0;i<v.size();i++) {
if(v.get(i).equals(child)) {
return i;
}
}
return -1;
}
public void addTreeModelListener(TreeModelListener l) {
treeModelListeners.addElement(l);
}
public void removeTreeModelListener(TreeModelListener l) {
treeModelListeners.removeElement(l);
}
}
In meinem Programm kann man auf ausgewählte Datensätze verschiedene Aktionen ausführen, so z.B. "Datensatz löschen". Wird ein Datensatz gelöscht, wird er im controller aus der collection geschmissen, aus der Datenbank gelöscht sowie, falls dieser Datensatz der aktuell selektierte war, der aktuell selektierte Datensatz auf null gesetzt. Nun werden alle DatenObserver benachrichtigt (wie z.B. mein JTree)
Soweit so gut, nun zum Problem.
Wähle ich in meinem JTree einen Datensatz aus, und lösche diesen, wird der Controller aufgerufen, dieser löscht den Datensatz und benachrichtigt wieder meinen JTree, sich zu aktualisieren. Aus irgendeinem Grund wird von meinem JTree jedoch noch bevor ich diesen neu aktualisieren kann, ein TreeSelectionEvent ausgelöst. Bei einem solchen Event, wird versucht im Controller der aktuelle Datensatz zu setzen. Da es jedoch nicht erlaubt ist, einen nichtvorhandenen Datensatz als den aktuellen Datensatz zu setzen werfe ich eine Exception.
Kann mir nun vielleicht irgendjemand erklären, weshalb vom JTree ein selection event ausgelöst wird, und zwar mit dem Datensatz den es ja gar nicht mehr gibt (und den natürlich auch vom TreeModel gar nicht mehr geliefert wird).
Bin für alle Informationen dankbar!
Grüsse gegel