2013-12-04 3 views
1

Как я могу получить JTree, чтобы послушать только его TreeModel, пока он на самом деле виден для пользователя или, по крайней мере, чтобы он отменил регистрацию, как только будет установлен соответствующий JFrame?Как отменить регистрацию JTree из TreeModel, пока она не видна?

Насколько я вижу единственный случай, JTree снимает с себя свою модель, если вы передадите ей новую модель (используя setModel(…)).

Это приводит к тому, что дерево не собирает мусор, если на модель ссылаются откуда-то еще. Пример: я реализовал TreeModel с использованием WatchService, чтобы иметь всегда обновленную модель дерева файловой системы. Даже один слушатель на модели требует, чтобы я оставил WatchService, информируя модель о изменениях файловой системы, поэтому сбор мусора невозможен. Таким образом, даже если JTree больше не отображается, он по-прежнему хранится в памяти моделью, которая все еще нуждается в получении обновлений от WatchService, хотя ничто из этого не требуется больше.

Я думаю, что лучший способ - создать новый класс, расширяющий JTree, который регистрирует и отменяет регистрацию из модели. Если да, то какие методы вызывают, когда компонент отображается или удаляется? Вероятно, addNotify() и removeNotify() являются хорошими кандидатами?

+0

TreeModel? У вас должна быть настроенная таблица для начала ... JTables имеет TableModel. –

+0

К сожалению, я имел в виду 'JTree', а не' JTable', я отредактирую свой вопрос, спасибо! :-П – siegi

ответ

0

Использование документации 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 удален из окна.

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