ethrandil
2003-05-14, 22:05:24
Hiho, Java mal wieder =D
ein recht spiezielles Problem, das auhc in den Java Foren nie wirklich gelöst wurde (bzw. niemand hat seine Lösung preisgegeben ...):
Ich habe eine von JTree abgeleitete Klasse, die Dynamisch ihre Nodes generiert (basiert auf SQL).
Wenn nun ein Node geändert wird und ich 'nodeStructureChanged' aufrufe ist der Tree ganz eingeklappt. Nun möchte ich ihn aber wieder ausklappen. Dazuhabe ich mir vorher alle ausgeklappten Nodes gemerkt ( getExpandedDescendants(this.getPathForRow(0)) ) Um sie danach der Reihe nach wieder aufzuklappen ( this.expandPath(TreePath) ).
Leider funktioniert das ganze nicht! Wenn ich nur eine Ebene underm Root aufgeklappt habe gehts noch, aber wenn ich mehr habe nicht!
Ich habe auch mal versucht das Ausklappen von 'oben nach unten' zu machen, indem ich die Reihenfolge des Ausklappens sortiere: Nix!
Wie kann ich das machen?? Hat jemand eine Ahnung?
Eth.
Hier der Code für die updadtefunktion:
public void update(){
DefaultTreeModel dtm = (DefaultTreeModel) this.getModel();
Enumeration expanded = this.getExpandedDescendants(this.getPathForRow(0));
dtm.nodeStructureChanged((DefaultMutableTreeNode)this.getPathForRow(0).getLastPa thComponent());
Vector paths = new Vector();
Vector levels = new Vector();
int maxLevel = -1;
int actualLevel = 0;
while(expanded.hasMoreElements()){
TreePath tp = (TreePath)expanded.nextElement();
paths.add(tp);
StringTokenizer st = new StringTokenizer(tp.toString(), ",");
levels.add(paths.indexOf(tp),new Integer(st.countTokens()));
if(st.countTokens() > maxLevel)
maxLevel = st.countTokens();
}
Object[] pathsV = paths.toArray();
Object[] levelsV = levels.toArray();
while(actualLevel <= maxLevel){
for(int i = 0; i< levelsV.length; ++i){
if(((Integer)levelsV[i]).intValue() == ActualLevel &&
!this.isExpanded(new TreePath((TreePath)pathsV[i]))){
System.out.print(pathsV[i]);
this.expandPath((TreePath)pathsV[i]);
this.setExpandedState((TreePath)pathsV[i], true);
if(this.isExpanded((TreePath)pathsV[i]))
System.out.println("done");
else
System.out.println("failed");
}
}
actualLevel++;
}
}
EDIT: Ich weiß auch das der Code zum sortieren nicht schön ist, den hab ich halt nur mal zum probieren reingebastelt, ums zu testen: negativ.
ein recht spiezielles Problem, das auhc in den Java Foren nie wirklich gelöst wurde (bzw. niemand hat seine Lösung preisgegeben ...):
Ich habe eine von JTree abgeleitete Klasse, die Dynamisch ihre Nodes generiert (basiert auf SQL).
Wenn nun ein Node geändert wird und ich 'nodeStructureChanged' aufrufe ist der Tree ganz eingeklappt. Nun möchte ich ihn aber wieder ausklappen. Dazuhabe ich mir vorher alle ausgeklappten Nodes gemerkt ( getExpandedDescendants(this.getPathForRow(0)) ) Um sie danach der Reihe nach wieder aufzuklappen ( this.expandPath(TreePath) ).
Leider funktioniert das ganze nicht! Wenn ich nur eine Ebene underm Root aufgeklappt habe gehts noch, aber wenn ich mehr habe nicht!
Ich habe auch mal versucht das Ausklappen von 'oben nach unten' zu machen, indem ich die Reihenfolge des Ausklappens sortiere: Nix!
Wie kann ich das machen?? Hat jemand eine Ahnung?
Eth.
Hier der Code für die updadtefunktion:
public void update(){
DefaultTreeModel dtm = (DefaultTreeModel) this.getModel();
Enumeration expanded = this.getExpandedDescendants(this.getPathForRow(0));
dtm.nodeStructureChanged((DefaultMutableTreeNode)this.getPathForRow(0).getLastPa thComponent());
Vector paths = new Vector();
Vector levels = new Vector();
int maxLevel = -1;
int actualLevel = 0;
while(expanded.hasMoreElements()){
TreePath tp = (TreePath)expanded.nextElement();
paths.add(tp);
StringTokenizer st = new StringTokenizer(tp.toString(), ",");
levels.add(paths.indexOf(tp),new Integer(st.countTokens()));
if(st.countTokens() > maxLevel)
maxLevel = st.countTokens();
}
Object[] pathsV = paths.toArray();
Object[] levelsV = levels.toArray();
while(actualLevel <= maxLevel){
for(int i = 0; i< levelsV.length; ++i){
if(((Integer)levelsV[i]).intValue() == ActualLevel &&
!this.isExpanded(new TreePath((TreePath)pathsV[i]))){
System.out.print(pathsV[i]);
this.expandPath((TreePath)pathsV[i]);
this.setExpandedState((TreePath)pathsV[i], true);
if(this.isExpanded((TreePath)pathsV[i]))
System.out.println("done");
else
System.out.println("failed");
}
}
actualLevel++;
}
}
EDIT: Ich weiß auch das der Code zum sortieren nicht schön ist, den hab ich halt nur mal zum probieren reingebastelt, ums zu testen: negativ.