我有一个JTree的行为如下:
根有一个RootObject
类型的用户对象;它使用纯文本标签,并且在树的整个生命周期中都是静态的。
每个子对象都有一个类型为ChildObject
的用户对象,该对象可能处于以下三种状态之一:未运行,正在运行或已完成。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
有什么想法我要去哪里吗?提前致谢!
最佳答案
因此,您需要告诉树模型内容已更改。
每次更改ChildObject的状态时,都必须执行以下操作:
((DefaultTreeModel)tree.getModel()).reload(node);
其中
node
是DefaultMutableTreeNode
,其中包含已更改的ChildObject。如果子对象的状态在Swing-Thread(EDT)之外更改,请不要忘记使用SwingUtilities.invokeLater()。