基本上我在private string status="OK"
的{{1}}中修改了一个属性UserObject()
。
我有一个DefaultTreeNode()
的CustomRenderer,它通过呈现implements DefaultCellRenderer
的{{1}}的“OK”属性来设置Icon。
最初,当我选择一个节点时,图标会发生变化。我正在使用UserObject
& TreeNode
,正在反映这一变化。
但是,我不确定这是否非常有效。这样做的正确方法是什么?我尝试Tree.revalidate()
,但Tree.repaint()
不会触发。
因此,每次更改TreeNode的用户工作以查看图形更新时,我是否坚持使用重新绘制整个树?
答案 0 :(得分:5)
使用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()
,则通知将自动发生。如果需要,可以搜索树here。
答案 1 :(得分:2)
当您希望更新模型时,就像您在此处所做的那样,您想要调用nodeChanged是正确的。我认为可能是错误的是你传入一个全新的节点,这显然与树中的节点不匹配。尝试传入对您修改的树中的节点的引用 - 这样模型就可以知道您修改了哪个节点。