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

我有一个CustomRenderer,它的implements DefaultCellRenderer通过呈现UserObjectTreeNode的“ 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;
    }
}


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

10-06 09:36