次のように動作する 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
私が間違っているアイデアはありますか?前もって感謝します!