我有以下问题(这与我的帖子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();在计时器和单元格渲染器中,我循环遍历节点,看它是否显示与我存储的节点相同的文本,我希望我得到闪烁,工作
由于
答案 0 :(得分:1)
我认为DefaultMutableTreeNode不定义equals方法,因此它可能无法在您的节点列表中找到匹配项。尝试存储和搜索用户对象,或者扩展DefaultMutableTreeNode并定义equals。
答案 1 :(得分:0)
实际上TreePath
是一个对象列表......从树根到节点的路径。如果从单个节点创建路径,则仅当节点是树的根时,路径才存在于树中。
我建议使用TreeSelectionEvent public TreePath[] getPaths()
方法。该方法提供了实际路径。