基本上我在DefaultTreeNode()
的UserObject()
中编辑了一个属性private string status="OK"
。
我有一个CustomRenderer implements DefaultCellRenderer
,它通过渲染TreeNode
的UserObject
的"OK"属性来设置图标。
原来,当我选择一个节点时,图标会改变。我用的是Tree.revalidate()
&Tree.repaint()
,并且正在反映更改
然而,我不确定这是否非常有效。正确的做法是什么?我试着做TreeModel.nodesChanged(new DefaultMutableTreeNode(myUserObject))
,但TreeNodeChanged event
不会着火。
所以我坚持使用重新绘制整个树每次用户对象的TreeNode被改变,以看到图形更新?
使用TreeIconDemo2
中所示的方法根据模型的值来调整渲染器。例如,
private class MyRenderer extends DefaultTreeCellRenderer {
private Icon okIcon;
public MyRenderer(Icon okIcon) {
this.okIcon = okIcon;
}
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean exp, boolean leaf, int row, boolean hasFocus) {
super.getTreeCellRendererComponent(
tree, value, sel, exp, leaf, row, hasFocus);
YourMutableTreeNode node = (YourMutableTreeNode) value;
if (leaf && node.getStatus().equals("OK")) {
setIcon(okIcon);
}
return this;
}
}
附录:你不能简单地在一个不属于树的新的TreeNode
上调用nodeChanged()
;新节点没有父节点。如果您将现有节点指定为nodeChanged()
,则通知将自动发生。如果需要,这里有一个搜索树的例子。
当您想要更新模型时,就像您在这里所做的那样,您想要调用nodeChanged方法是正确的。我认为可能是错误的是,您传入了一个全新的节点,它显然与树中找到的节点不匹配。尝试将引用传递到您修改过的树中的节点—这样模型就可以找到您修改过的节点。