在不重新绘制树的情况下更新JTree中的ImageIcon?

基本上我在DefaultTreeNode()UserObject()中编辑属性private string status="OK"

我有一个CustomRenderer implements DefaultCellRenderer ,它通过呈现TreeNodeUserObject的“OK”属性来设置Icon。

最初,当我选择一个节点时,图标会发生变化。 我正在使用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是正确的。 我认为可能是错误的是你传入的是一个全新的节点,它显然与树中的节点不匹配。 尝试传入对您修改的树中的节点的引用 – 这样模型可以找到您修改的节点。