2012-06-17 2 views
1

Просто пытаетесь выяснить, что происходит, с точки зрения потоков, если вы изменяете объект пользователя DefaultMutableTreeNode в потоке, отличном от EDT?Как реагирует JTree на измененный DefaultMutableTreeNode?

Я не говорю о событиях DefaultTreeModel, а именно insertNodeInto и removeNodeFromParent, что я довольно ясно, всегда должен быть запущен в EDT ... я думаю ...

В случае изменения в пользовательских объектах узлов, похоже, что JTree.TreeModelHandler - это то, что «слушает» такие события ... но есть ли причина ожидать, что слушатель будет уведомлен только о таком изменении в потоке, где событие получилось? И будет распространять свой ответ только в той же самой теме?

Очевидно, поэтому я предполагаю, что это довольно простой шаблон «наблюдателя».

Значит ли это, что большинство изменений в узлах JTree на самом деле должно произойти в EDT, в противном случае, что-то не происходит, когда и когда вы ожидаете?

В API для DefaultMutableTreeNode это действительно говорит, что «вы должны сделать свою собственную» синхронизацию ...

ответ

4

Правил Качелей пронизывающими очень просты: Качели однопоточные, и все операции, связанные с компонентами Swing, должны происходят на EDT.

Так как только ваши TreeModel содержащих DefaultMutableTreeNode с устанавливаются на JTree лучше убедись, что любые изменения, внесенные в модель (или узел), и соответствующие события, срабатывающие происходят на EDT.

+0

'JTree' особенно чувствителен к этому важному принципу; см. также [Начальные потоки] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod

+0

спасибо ... в каком-то смысле я удивляюсь, почему большинство/все методы JTree (и другие JComponent) не включали в себя тест isEventDispatchThread() ... и запрещают вызовы без EDT ... –

+0

@mikerodent В JavaFX они позаботились об этом. Вы можете сделать это самостоятельно, установив пользовательский менеджер перерисовки (см. [Эту статью] (http://weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html)) – Robin

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