在JTree中更新ImageIcon而不重新绘制树



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

我有一个CustomRenderer implements DefaultCellRenderer,它通过渲染TreeNodeUserObject的"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;
    }
}

附录:你不能简单地在一个不属于树的新的TreeNode上调用nodeChanged();新节点没有父节点。如果您将现有节点指定为nodeChanged(),则通知将自动发生。如果需要,这里有一个搜索树的例子。

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

最新更新