Swing JTree Node Text nicht richtig angezeigt

  • Themenstarter Themenstarter Saerileth
  • Beginndatum Beginndatum
S

Saerileth

Gast
Hallo allerseits,

Ich habe ein extrem frustrierendes Problem mit einer Klasse, die einen JTree verwendet. Bei der Initialisierung wird ein JTree mit einem Root und zwei Nodes ("personal Templates" und "accessedTemplates") erschaffen. Die beiden Nodes werden anhand einer Datenbank mit weiteren Einträgen gefüllt. Zur Laufzeit will ich weitere Objekte hinzufügen oder entfernen, ohne treeModel.reload() aufzurufen, da sonst alle geöffneten Node wieder kollabieren. Dazu habe ich die folgenden paar Methoden geschrieben.

[Java]
public void insertTemplate(String temp, boolean b)
{
DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel();

if(b)
{
DefaultMutableTreeNode tempNode = new DefaultMutableTreeNode(temp);
treeModel.insertNodeInto(tempNode, personalTemplates, personalTemplates.getChildCount());
tree.makeVisible(new TreePath(tempNode.getPath()));
treeModel.nodeChanged(tempNode);
}
else
{
DefaultMutableTreeNode tempNode = new DefaultMutableTreeNode(temp);
treeModel.insertNodeInto(tempNode, accessedTemplates, accessedTemplates.getChildCount());
}
}

public void removeItem(String i)
{
DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel();

DefaultMutableTreeNode node = getNode(i);
if(node != null)
{
treeModel.removeNodeFromParent(node);
}
}

public void updateNodeID(String i)
{
DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel();

treeModel.nodeChanged(getNode(i));
}

private DefaultMutableTreeNode getNode(String i)
{
Enumeration e = personalTemplates.breadthFirstEnumeration();
while(e.hasMoreElements())
{
DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement();
if(node.getUserObject().equals(i))
{
return node;
}
}

e = accessedTemplates.breadthFirstEnumeration();
while(e.hasMoreElements())
{
DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement();
if(node.getUserObject().equals(i))
{
return node;
}
}

return null;
}
[/code]

Einzeln gesehen funktionieren alle diese Methoden einwandfrei, auch der Titel des Nodes wird nach einer Veränderung korrekt angezeigt, wenn updateNodeID() aufgerufen wird. ABER: Wird durch removeItem() ein Objekt aus personalTemplates oder accessedTemplates entfernt und danach über insertItem() beim jeweils anderen wieder eingefügt, wird manchmal die Breite des Titels nicht mehr korrekt angezeigt, dass heisst, gekürzt und mit ... versehen. Ich schreibe "manchmal", weil der Fehler nicht immer auftritt, je nachdem, was wo schon in der Liste ist und welche Länge die jeweiligen Strings haben. Es scheint auch irgendwas damit zu tun zu haben, welcher Thread den Aufruf macht, da das Problem über's Netzwerk nur bei denjenigen Benutzern auftritt, die die Aktion NICHT ausgelöst haben, sprich, bei denen der Aufruf von einem im Programm neu angelegten Thread getätigt wird.

Besser kann ich das Problem nicht eingrenzen, da ich nicht die geringste Ahnung habe, woran es liegt.
 
Edit: Das Problem scheint überdies nur beim Hinzufügen von Nodes aufzutreten, die ihrerseits Kinder haben. Von dem her ist das Beispiel oben zu stark vereinfacht. Dummerweise umfasst die Applikation im Moment satte 6000 Zeilen Code, die ich wohl kaum alle hier posten kann... und ich weiss wirklich nicht, in welcher Klasse der Fehler zu suchen ist.
 

Neue Themen


Zurück
Oben