1

基本的に、の属性private string status="OK"を編集します。UserObject()DefaultTreeNode()

implements DefaultCellRendererの「OK」属性をレンダリングしてアイコンを設定する CustomRenderer がありUserObjectますTreeNode

もともと、ノードを選択するとアイコンが変わります。Tree.revalidate()&を使用してTree.repaint()おり、変更が反映されています。

ただし、これが非常に効率的かどうかはわかりません。これを行う適切な方法は何ですか?やってみTreeModel.nodesChanged(new DefaultMutableTreeNode(myUserObject))ましたが、TreeNodeChanged event発火しません。

TreeNode の userboject が変更されてグラフィックの更新が表示されるたびに、ツリー全体を再描画することに固執していますか?

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()newを単純に呼び出すことはできません。TreeNode新しいノードには親がありません。既存のノードを に指定するnodeChanged()と、通知は自動的に行われます。必要に応じて、ここにツリーを検索する例があります。

于 2011-12-02T04:38:26.947 に答える