Размер кэширования
JTree использует средство визуализации для визуализации узлов.Рендерер - это один и тот же рендерер для всех операционных систем, поэтому различные взгляды находятся внутри ComponentUIs .JTree по умолчанию использует JLabel для рисования узлов, поэтому размер JLabel помогает нам вырезать текст, используя ...
.
Позволяет сделать краткий обзор: Swing имеет разные LookAndFeels для разных операционных систем, ониотсоединен от компонентов в UI-классах, таких как BasicLabelUI (и это источник вашей проблемы). BasicLabelUI кэширует размер метки, чтобы предотвратить пересчет, если не было внесено никаких изменений.Поэтому BasicLabelUI не очистил кэш этих старых значений размера. BasicLabelUI действительно очищает кеш, если ему сообщают о каких-либо изменениях.
Вопрос в том, почему BasicLabelUI не получает информацию об изменениях?Что ж, если вы изменяете / расширяете / переименовываете дерево программно, вы должны сказать ComponentUI удалить этот кеш!
Вам повезло, вам не нужно писать много кода, потому что гений уже написал что-то для вас, создателейкласса TreeUI Роб Дэвис и Скотт Вайолет написал startEditingAtPath и stopEditing.
Пример
TreeUI ui = tree.getUI();
for (TreePath treePath : selectionPaths) {
ui.startEditingAtPath(tree, treePath);
}
tree.setSelectionPaths(selectionPaths);
tree.expandPath(expandPaths.getSelectionPath());
ui.stopEditing(layer);