通过引用操作jtree节点似乎不起作用(swing)

时间:2010-12-22 16:22:33

标签: java user-interface swing jtree

我有以下问题(这与我的帖子blink a tree node有关):
我有一个自定义的单元格渲染器 在我的代码的某些部分,我创建了一个新的DefaultMutableTreeNode并将其存储在列表

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分支 为什么?我无法理解,因为我已经将它存储在arraylist中。我有不同的参考吗? 我还创建了一个摇摆计时器:

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();在计时器和单元格渲染器中,我循环遍历节点,看它是否显示与我存储的节点相同的文本,我希望我得到闪烁,工作

由于

2 个答案:

答案 0 :(得分:1)

我认为DefaultMutableTreeNode不定义equals方法,因此它可能无法在您的节点列表中找到匹配项。尝试存储和搜索用户对象,或者扩展DefaultMutableTreeNode并定义equals。

答案 1 :(得分:0)

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