2010-12-22 59 views
1

我有以下问题(这与我的文章blink a tree node有关):
我有一个自定义单元格渲染器。
在我的代码一些部分我创建了一个新的DefaultMutableTreeNode,并在列表通过引用操作jtree节点似乎不工作(摆动)

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

存储在我的单元格渲染我做的:

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

此时节点有一个节点,但该代码永远不会进入if分支。
为什么?我无法理解,因为我已经将它存储在数组列表中。我有不同的参考吗?
此外,我创建了一个秋千计时器:

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); 
    } 

});  

但我在tree.getPathBounds得到NPE。
我不明白为什么。我不能操纵我以这种方式存储在我的列表中的DefaultMutableNodes?我在想什么是错的?
注意:如果我只是调用repaint();在计时器,并在单元格渲染我遍历所有的节点,看它是否显示与我已存储节点的sametext,我想我所得到的闪烁,工作

感谢

回答

0

其实TreePath是从树根到节点的对象...路径的列表。如果您从单个节点创建路径,则只有当该节点是树的根时,该路径才存在于树中。 我建议使用TreeSelectionEvent public TreePath[] getPaths()方法。该方法提供了实际路径。

1

我不认为DefaultMutableTreeNode定义了一个equals方法,所以它可能在你的List节点中找不到匹配。尝试存储和搜索用户对象,或者扩展DefaultMutableTreeNode并定义equals。

+0

好的,这是有道理的。但NPE怎么样在treePath? – Cratylus 2010-12-22 20:02:07

+0

不确定。 tree.repaint()是否工作?它只是越来越是问题的边界吗? – jzd 2010-12-22 20:46:09