2010-09-29 2 views
8

Я использовал JTree в своем графическом интерфейсе и добавил его в JFrame. Когда я хочу обновить его и изменить его узлы в другой части моей программы (во время работы программы, в качестве выполненного действия) я пытаюсь добавить новые узлы или удалить на ней узлы; Но мой интерфейс не меняется. Пожалуйста, предложите мне решение.обновление JTree в java GUI

С уважением

ответ

15

В дополнение к предложению insertNodeInto вы также можете использовать:

DefaultTreeModel model = (DefaultTreeModel)tree.getModel(); 
DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot(); 
root.add(new DefaultMutableTreeNode("another_child")); 
model.reload(root); 
+1

Так что спасибо за ваш достойный ответ! Каждый раз, когда я хочу обновить свое дерево, я использую этот метод. – sajad

+3

Это будет работать, но это подход «грубой силы» при работе с большими деревьями. Например, если бы я должен был зацикливать и добавить 1000 узлов к дереву, уже содержащему 50 000 элементов, это было бы очень неэффективно. – Adamski

+1

В дикой природе, как часто дерево становится достаточно большим, чтобы это стало достаточно медленным, чтобы беспокоиться? –

2

Вы должны убедиться, что после обновления модели вы учите его уволить событие, чтобы вызвать какие-либо зарегистрированные слушатели, которые будут уведомлены о событии. Один из слушателей будет JTree, и после получения события он будет перерисовываться.

Например, DefaultTreeModel содержит методы:

nodeChanged nodesChanged nodeStructureChanged nodesWereInserted nodesWereRemoved

Кроме того, как все свинг программирования, нужно, чтобы убедиться, что вы обновляете свою модель на событий Отправка Тема:.

+1

Вам не нужно снимать эти события самостоятельно. Все, что вам нужно сделать, это обновить модель, например, вызвав метод 'insertNodeInto', и пусть модель позаботится об активировании событий для TreeModelListeners. – dogbane

+1

Хорошая точка, хотя в некоторых случаях было бы лучше управлять ею самостоятельно. Например, если бы я хотел добавить 1000 дочерних узлов, я бы не хотел запускать 1000 «узлов». – Adamski

+0

Спасибо, сэр! Но эти методы, которые вы упомянули, являются частными и не могут быть доступны. – sajad

-1

Вы имеете в виду графический аспект просто не показывая ваши изменения? Вероятно, вы должны посмотреть int repaint() и revalidate().

Here's хорошее описание, когда позвонить кому.

+0

Да, эти методы необходимы. – sajad

+4

-1, No repaint() и revalidate() не нужны. Когда вы обманываете модель, модель отвечает за уведомление об изменении, чтобы дерево могло перекрасить себя. – camickr

Смежные вопросы