JTree обновляет в реальном времени? - PullRequest
1 голос
/ 17 сентября 2009

Я ищу многопоточное решение для обновления моего JTree каждую секунду.

По сути, я ...

  • Импорт внешнего файла
  • Создание перечисления из этого
  • Построение дерева из перечисления

Внешний файл может изменяться случайным образом, и данные в дереве должны представлять это изменение в несколько разумных временных рамках. Как бы я мог перерисовать дерево, не перерисовывая всю панель контента, в которой находится JTree (через панель)?

Спасибо!

Ответы [ 5 ]

4 голосов
/ 17 сентября 2009

Просто пусть модель JTree запустит обновление, и JTree перекрасит себя. Самый простой способ сделать это - использовать DefaultTreeModel, а когда файл изменяется, создать TreeNodes (возможно, используя DefaultMutableTreeNode) из вашего файла и вызвать setRoot () для модели с базовым узлом вашего вновь созданного дерева узлов. *

1 голос
/ 21 сентября 2011

Попробуйте, если ваше дерево использует DefalultTreeModel

((DefaultTreeModel)yourTree.getModel()).reload();
1 голос
/ 04 ноября 2009

Полагаю, вы, вероятно, читали это где-то еще: Swing не сохраняет потоки;). Если вы все равно хотите обновить компонент Swing из другого потока, вы должны заставить этот другой поток загружать свои обновления в поток событий Swing. Метод для этого - EventQueue.invokeAndWait (Runnable).

Вот пример кода для аналогичной проблемы (синхронизация JTree с деревом каталогов): http://www.onyxbits.de/content/java-and-directory-trees-joy-implementing-simple-filemanager

Вас должен заинтересовать файл FileMonitor.java.

0 голосов
/ 18 сентября 2009

Я бы сделал что-то похожее на @Tom, если у вас много узлов. Решение @CarlG, вероятно, подходит для нескольких узлов. Если вы обновляете всю модель дерева, каждую секунду вы сталкиваетесь с проблемами производительности.

Я бы обновил только видимые границы дерева, если необходимо, и сохранил бы где-нибудь AST (синтаксическое дерево). Если модель дерева (из проанализированного документа) меняется каждую секунду, я серьезно сомневаюсь, что у пользователя будет время прокручивать все дерево каждую секунду.

User scrolled to bounds XXX
A = First visible node
B = Last visible node
if someRangeBefore(A) is dirty update
If region(A, B) is dirty
  update nodes

Было бы сложнее, чем выше, реализовать работающую и очень эффективную стратегию обновления узлов.

0 голосов
/ 17 сентября 2009

Если перекрасить компонент JTree, область рисования будет вырезана из остальной части содержащей панели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...