基本上,我在private string status="OK"
的UserObject()
中编辑属性DefaultTreeNode()
。
我有一个CustomRenderer,它的implements DefaultCellRenderer
通过呈现UserObject
的TreeNode
的“ 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;
}
}
附录:您不能简单地在不属于树的新
nodeChanged()
上调用TreeNode
;新节点没有父节点。如果为nodeChanged()
指定现有节点,则通知将自动发生。如果需要,有一个搜索树here的示例。