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

时间:2011-12-02 01:58:05

标签: java swing jtree repaint treemodel

基本上我在private string status="OK"的{​​{1}}中修改了一个属性UserObject()

我有一个DefaultTreeNode()的CustomRenderer,它通过呈现implements DefaultCellRenderer的{​​{1}}的“OK”属性来设置Icon。

最初,当我选择一个节点时,图标会发生变化。我正在使用UserObject& TreeNode,正在反映这一变化。

但是,我不确定这是否非常有效。这样做的正确方法是什么?我尝试Tree.revalidate(),但Tree.repaint()不会触发。

因此,每次更改TreeNode的用户工作以查看图形更新时,我是否坚持使用重新绘制整个树?

2 个答案:

答案 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是正确的。我认为可能是错误的是你传入一个全新的节点,这显然与树中的节点不匹配。尝试传入对您修改的树中的节点的引用 - 这样模型就可以知道您修改了哪个节点。