Визуализация узлов JTree и изменение шрифта - PullRequest
4 голосов
/ 10 февраля 2011

У меня проблема с рендерингом узлов в JTree.Когда шрифт узла изменяется и текст узла расширяется таким образом, то текст узла обрезается, а конец текста заменяется точками.Как тогда сказать JTree, что он должен расширить область для визуализации всего узла.

Спасибо за помощь

Ответы [ 4 ]

3 голосов
/ 10 февраля 2011

Вы можете использовать пользовательский рендерер и установить для компонента (JLabel) что-то вроде этого

final Dimension size = label.getPreferredSize(); 
label.setMinimumSize(size); 
label.setPreferredSize(size);

или просто установить текст следующим образом

setText("<html>" +valueText+"</html>")
0 голосов
/ 28 июля 2017

Размер кэширования

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);
0 голосов
/ 20 января 2012

Похоже, что запуск изменения шрифта происходит под ногами дерева: внутренне, делегат пользовательского интерфейса делает много кэширования размера, который должен обновляться при любом изменении, которое влияет на размеры кэшируемого.Это делается автоматически при изменениях в treeModel, соответствующем состоянии расширения и некоторых визуальных изменениях самого дерева.

Итак, основной вопрос: что вызывает изменение шрифта?Если это какое-то изменение модели / узлов, реализация модели некорректна, поскольку не запускает соответствующий TreeModelEvent, очевидным решением будет исправить это :-) Если это что-то вне модели, решение зависит от деталей вашего контекстаничего вообще не применимо.

0 голосов
/ 20 января 2012

Позвоните вашему TreeModel reload()

...