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

Java 是否在不重新绘制树的情况下更新JTree中的ImageIcon?,java,swing,jtree,repaint,treemodel,Java,Swing,Jtree,Repaint,Treemodel,基本上,我在DefaultTreeNode()的UserObject()中编辑属性private string status=“OK” 我有一个CustomRenderer,实现了DefaultCellRenderer,它通过呈现TreeNode的UserObject的“OK”属性来设置图标 最初,当我选择一个节点时,图标会改变。我正在使用Tree.revalidate()&Tree.repaint(),并且正在反映更改 但是,我不确定这是否非常有效。这样做的正确方式是什么?我尝试执行TreeM

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

我有一个CustomRenderer,
实现了DefaultCellRenderer
,它通过呈现
TreeNode
UserObject
的“OK”属性来设置图标

最初,当我选择一个节点时,图标会改变。我正在使用
Tree.revalidate()
&
Tree.repaint()
,并且正在反映更改

但是,我不确定这是否非常有效。这样做的正确方式是什么?我尝试执行
TreeModel.nodesChanged(新的DefaultMutableTreeNode(myUserObject))
但是
TreeNodeChanged事件将不会触发


那么,每次更改树节点的用户对象以查看图形更新时,我是否坚持使用重新绘制整个树?

当您希望更新模型时,正如您在这里所做的那样,您想调用nodeChanged是正确的。我认为可能错误的是,您正在传入一个全新的节点,它显然与树中找到的节点不匹配。尝试在您修改的树中传递对节点的引用-这样模型可以找到您修改的节点。

当您希望更新模型时,正如您在此处所做的那样,您希望调用nodeChanged是正确的。我认为可能错误的是,您正在传入一个全新的节点,它显然与树中找到的节点不匹配。尝试传递对您修改的树中节点的引用-这样模型可以找到您修改的节点。

使用中所示的方法根据模型的值调整渲染器。比如说,

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()
,则通知将自动发生。如果需要,这里有一个搜索树的示例。

使用中所示的方法根据模型的值调整渲染器。比如说,

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()
,则通知将自动发生。如果需要,有一个搜索树的示例。

如果通知正确,则无需重新验证/-绘制如果通知正确,则无需重新验证/-绘制如果通知正确,则在技术上正确,仅:如果缺少更改通知,则称为“下一步”的时间是偶然的:-)在技术上正确,仅:称为“下一步”的时间如果缺少更改通知,则为意外:-)