在不重新绘制树的情况下更新JTree中的ImageIcon?
基本上我在DefaultTreeNode()
的UserObject()
中编辑属性private string status="OK"
。
我有一个CustomRenderer implements DefaultCellRenderer
,它通过呈现TreeNode
的UserObject
的“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是正确的。 我认为可能是错误的是你传入的是一个全新的节点,它显然与树中的节点不匹配。 尝试传入对您修改的树中的节点的引用 – 这样模型可以找到您修改的节点。