Как динамически изменить представление JTree при изменении состояния объекта узла? - PullRequest
2 голосов
/ 29 июня 2009

Я реализую панель Java JTree. Эта панель содержит построение TreeModel из набора древовидных структур (список списков композитов - разных классов). Я получаю эту структуру данных из внешних реализаций jar на основе набора интерфейсов, которые я определил.

Триоды содержат флажок, который пользователь может установить, чтобы указать, что проверенный узел и все дочерние узлы должны стать «активными», то есть объекты, представленные узлами, должны что-то делать, например, получать данные из базы данных.

Треноды также могут быть выбраны без их «активации», то есть без флажка.

Кроме того, другие части программы могут также переключать состояние активации объектов модели данных. Таким образом, модель данных, из которой построена древовидная модель, является источником состояния активации. Это должно быть отражено в древовидном представлении, динамически (не) устанавливая флажок.

Теперь, как мне реализовать это целое? Кто должен быть слушателем для каких изменений?

Теперь у меня есть все классы, которые находятся в узлах, выходящие из абстрактного класса, который содержит поле активации. Это настоящий источник данных. Когда это поле изменяется, все подписанные слушатели (EventListener) должны быть уведомлены, включая флажки.

У меня также есть TreeSelectionModel, которая основана на TreeSelectionModel по умолчанию, но расширена функциональностью, чтобы проверить, нужно ли проверять детей / родителей.

Возможно, мои вопросы не совсем понятны, но и этот сложный кусок кода. Надеюсь, что вы можете помочь.

Ответы [ 3 ]

2 голосов
/ 29 июня 2009

Кажется, у вас есть куча движущихся частей. Возможно, было бы хорошо направить все изменения через ваш TreeModel, и ваш JTree должен быть слушателем, как это будет автоматически. Если ваш TreeModel является подклассом DefaultTreeModel, вы получаете множество методов fire* (fireTableStructureChanged, fireTreeNodesChanged и т. Д.), Которые будут предупреждать ваш JTree о перерисовке. Убедитесь, что вы запускаете события в AWT EventQueue.

хороший учебник с множеством примеров использования Tree s.

1 голос
/ 30 июня 2009

Мне кажется, что у вас есть правильная идея - сделать узел каноническим источником «активированных» знаний и каноническим источником событий активации. Затем вы можете прослушать это TreeModel и преобразовать эти события в fireTreeNodesChanged() и т. Д., Что должно заставить JTree автоматически обновляться.

Чтобы избежать неприятностей, старайтесь поддерживать связь между узлами и событиями дерева одним способом - не используйте дерево в качестве контроллера, не позволяйте событиям дерева изменять состояние активации.

1 голос
/ 29 июня 2009

Проверьте компоненты jide . Также включает в себя флажок:

alt text

...