Как отменить регистрацию 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 добавляется в новое окно, вы можете добавить WindowListenerunregisterOrWhatever когда окно закрыто. Не забудьте также удалить WindowListener когда JTree удаляется из окна.

Другие вопросы по тегам