Как отменить регистрацию JTree в TreeModel, пока он не виден?
Как я могу получить JTree
только слушать его TreeModel
в то время как он на самом деле видим для пользователя или, по крайней мере, чтобы он отменил свою регистрацию, как только соответствующий JFrame
расположен?
Насколько я вижу, единственный случай JTree
отменяет регистрацию от своей модели, если вы передадите ей новую модель (используя setModel(…)
).
Это приводит к тому, что дерево не будет собирать мусор, если на модель ссылаются откуда-то еще. Пример: я реализовал TreeModel
используя WatchService
иметь всегда актуальную модель дерева файловой системы. Даже один слушатель на модели требует от меня сохранить WatchService
информирование модели об изменениях файловой системы, чтобы ее нельзя было собирать мусором. Так что даже если JTree
больше не виден, он все еще хранится в памяти моделью, которая все еще должна получать обновления от WatchService
хотя ничего из этого больше не нужно
Я думаю, что лучшим способом было бы создать новый класс, расширяющий JTree
что делает регистрацию и отмена регистрации в модели. Если да, то какие методы вызываются при показе или удалении компонента? Наверное addNotify()
а также removeNotify()
хорошие кандидаты?
1 ответ
Используя документацию JTree: http://docs.oracle.com/javase/7/docs/api/javax/swing/JTree.html.
JTree
имеет защищенное поле под названием treeModelListener
которые вы можете удалить из модели напрямую, используя JTreeModelListener.removeTreeModelListener()
, Если вы хотите удалить свою модель дерева из собственного слушателя по желанию, расширьте JTree
и добавьте следующий метод:
public void unregisterOrWhatever() {
this.treeModel.removeTreeModelListener(this.treeModelListener);
}
Если вы хотите получить удовольствие от прослушивания событий закрытия окна, добавьте HierarchyListener
на ваш JTree
который слушает HierarchyEvent.PARENT_CHANGED
События. Всякий раз, когда JTree добавляется в новое окно, вы можете добавить WindowListener
unregisterOrWhatever
когда окно закрыто. Не забудьте также удалить WindowListener
когда JTree
удаляется из окна.