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

KJW*_*KJW 1 java swing jtree repaint treemodel

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

我有其中CustomRenderer implements DefaultCellRenderer,其通过渲染的"OK"属性设置图标UserObjectTreeNode.

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

但是,我不确定这是否非常有效.这样做的正确方法是什么?我尝试过,TreeModel.nodesChanged(new DefaultMutableTreeNode(myUserObject))TreeNodeChanged event不会开火.

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

tra*_*god 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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