1

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

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

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

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

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

4

2 回答 2

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;
    }
}

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

于 2011-12-02T04:38:26.947 回答
2

当您想要更新模型时,就像您在此处所做的那样,您想要调用 nodeChanged 是正确的。我认为可能有问题的是您正在传递一个全新的节点,该节点显然与树中找到的节点不匹配。尝试传入对您修改的树中节点的引用 - 这样模型就可以知道您修改了哪个节点。

于 2011-12-02T02:51:10.793 回答