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.
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.