2

次のように動作する JTree があります。

  • ルートにはタイプ のユーザー オブジェクトがありRootObjectます。プレーンテキスト ラベルを使用し、ツリーの存続期間中は静的です。
  • 各子には、タイプ のユーザー オブジェクトがありChildObject、それは 3 つの状態 (実行中、実行中、終了) のいずれかになります。
  • が実行されていないときはChildObject、プレーンテキスト ラベルです。
  • ChildObject実行中は、アイコン リソースを使用し、HTML レンダリングに切り替えて、テキストがイタリック体になるようにします。
  • が完了するChildObjectと、別のアイコン リソースが使用され、HTML レンダリングを使用してテキストが太字で表示されます。

現在、私のコードは次のようになります。

public class TaskTreeCellRenderer extends DefaultTreeCellRenderer {
    private JLabel label;

    public TaskTreeCellRenderer() {
        label = new JLabel();
    }

    public Component getTreeCellRendererComponent(JTree tree,
           Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
        Object nodeValue = ((DefaultMutableTreeNode) value).getUserObject();

        if (nodeValue instanceof RootObject) {
            label.setIcon(null);
            label.setText(((RootObject) nodeValue).getTitle());
        } else if (nodeValue instanceof ChildObject) {
            ChildObject thisChild = (ChildObject) nodeValue;

            if (thisChild.isRunning()) {
                label.setIcon(new ImageIcon(getClass().getResource("arrow.png")));
                label.setText("<html><nobr><b>" + thisChild.getName() + "</b></nobr></html>");
            } else if (thisChild.isComplete()) {
                label.setIcon(new ImageIcon(getClass().getResource("check.png")));
                label.setText("<html><nobr><i>" + thisChild.getName() + "</i></nobr></html>");
            } else {
                label.setIcon(null);
                label.setText(thisChild.getName());
            }
        }

        return label;
    }
}

ほとんどの場合、これで問題なくレンダリングされます。最初のツリーは、平文を使用したラベルで適切にレンダリングされます。問題は、ChildObjectインスタンスの状態が変化し始めると、JLabels が HTML レンダリングを使用するように更新されますが、テキストまたはアイコンを補うためにサイズ変更されないことです。例えば:

初期状態:
http://imageshack.us/a/img14/3636/psxi.png

進行中:
http://imageshack.us/a/img36/7426/bl8.png

完成:
http://imageshack.us/a/img12/4117/u34l.png

私が間違っているアイデアはありますか?前もって感謝します!

4

1 に答える 1