Не обновляется дерево после изменения L&F программно
У меня есть маленькая программка, в которой есть дерево и кнопка "Изменить Look&Feel" (кроме дерева и этой кнопки ничего нет). Когда пользователь нажимает эту кнопку открывается диалоговое окно, где предлагается выбрать один из имеющихся в системе L&F. По закрытию диалога Look&Feel применяется к приложению. Но есть такая проблема: ноды в дереве не обновляются с одного L&F на другой. В частности, это иногда приводит к тому, что ноду не хватает места при новом L&F и часть его просто не видно.
Это код cell renderer'a:
class FileTreeCellRenderer implements TreeCellRenderer {
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
JPanel panel = new JPanel();
JLabel label = new JLabel();
if (value instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) value;
Object object = treeNode.getUserObject();
if (object instanceof MyDocumentClass) {
label.setText(((MyDocumentClass) object).getTitle());
} else {
label.setText("package");
}
label.setIcon(Icons.TREE_ITEM_ICON);
panel.add(label);
}
return panel;
}
}
Вот так получаю доступные L&F:
UIManager.LookAndFeelInfo[] lf = UIManager.getInstalledLookAndFeels();
А вот так применяю выбранный пользователем L&F:
try {
UIManager.LookAndFeelInfo selected = (LookAndFeelItem) comboBox.getSelectedItem()
UIManager.setLookAndFeel(selected.getClassName());
} catch (Throwable t) {
t.printStackTrace();
}
Источник: Stack Overflow на русском