2010-12-22 5 views
1

Ich habe das folgende Problem (das ist mit meinem Beitrag in Verbindung blink a tree node):
Ich habe einen benutzerdefinierten CellRenderer.
In einem Teil meines Codes erstelle ich eine neue DefaultMutableTreeNode und speichern sie in einer Listemanipulieren jtree Knoten über Referenzen scheint nicht funktioniert (Swing)

public static List<DefaultMutableTreeNode> nodes = new ArrayList<DefaultMutableTreeNode>() 
//in some time 
DefaultMutableTreeNode aNode = new DefaultMutableTreeNode("SomeValue"); 
nodes.add(node); 

In meiner Zelle Renderer ich tun:

public Component getTreeCellRendererComponent(JTree tree, Object value, 
     boolean selected, boolean expanded, boolean leaf, int row, 
     boolean hasFocus) { 
    DefaultMutableTreeNode n = (DefaultMutableTreeNode)value; 
    if(nodes.contains(n)){ 
    //set background to red 
    } 
} 

An dieser Stelle Knoten einen Knoten hat, aber den Code geht nie in den if-Zweig.
Warum? Ich kann es nicht verstehen, da ich es bereits in der Arraylist gespeichert habe. Bekomme ich eine andere Referenz?
Auch habe ich eine Swing-Timer:

Timer t = new Timer(400, new ActionListener(){ 
    public void actionPerformed(ActionEvent evt) { 
     if(nodes.size == 0) 
      return; 
     TreePath p = new TreePath(nodes.get(0)); 
     Rectangle r = tree.getPathBounds(p); 
     tree.repaint(r); 
    } 

});  

Aber ich eine NPE in tree.getPathBounds bekommen.
Ich kann nicht verstehen warum. Kann ich DefaultMutableNodes, die ich auf diese Weise in meiner Liste gespeichert habe, nicht bearbeiten? Was mache ich falsch in meinem Denken?
Hinweis: Wenn ich einfach repaint() aufrufen; im Timer und in der Zelle Renderer I Schleife über die Knoten zu sehen, ob es die sametext mit dem Knoten zeigt ich gespeichert habe, was ich will, bekomme ich das blinkt, arbeitet

Dank

Antwort

0

Eigentlich TreePath ist eine Liste von Objekten ... Pfad von Baumstamm zum Knoten. Wenn Sie einen Pfad vom einzelnen Knoten erstellen, ist der Pfad nur dann in der Struktur vorhanden, wenn der Knoten das Stammverzeichnis der Struktur ist. Ich würde empfehlen, TreeSelectionEvent public TreePath[] getPaths() Methode zu verwenden. Die Methode stellt tatsächliche Pfade bereit.

+0

Also wenn ich eine Liste von 'DefaultMutableTreeNodes' gespeichert habe und ich für jeden das entsprechende Rechteck (in meinem Swing-Timer) zum Repaint bekommen möchte, wie bekomme ich es? Weil es scheint, dass der einzige Weg darin besteht, einen 'TreePath' vom gespeicherten Knoten zu erstellen und dann 'getPathBounds' aufzurufen, aber das funktioniert nicht (wie in meinem Post erwähnt). Wie kann ich also das Rechteck der gespeicherten Knoten bekommen? – Cratylus

1

Ich glaube nicht, dass DefaultMutableTreeNode definiert eine equals-Methode, sodass die Übereinstimmung in Ihrer Knotenliste möglicherweise nicht gefunden wird. Versuchen Sie, das Benutzerobjekt zu speichern und zu suchen, oder erweitern Sie DefaultMutableTreeNode und definieren Sie equals.

+0

Ok, das macht Sinn. Aber was ist mit der NPE für den TreePath? – Cratylus

+0

Nicht sicher. Funktioniert tree.repaint()? Ist es nur das Problem? – jzd