Дизайн для TreeCellRenderer

Я изучал JTree и TreeCellRenderer. Это кажется в целом, приложение (с одним JTree) имеет только один экземпляр TreeCellRenderer. Приложение выполняет множественные вызовы к getTreeCellRendererComponent методу TreeCellRenderer, чтобы решить, как каждый TreeCell привлечен, и такой вызов выполняется во многих случаях (когда ячейка выбрана, невыбранная, отодвиньтесь, при прокрутке, и т.д.). Почему они решали сделать это вместо того, чтобы иметь несколько экземпляров TreeCellRenderer, каждый ответственный за одну ячейку??

Я пытаюсь сделать JTree, где каждая ячейка содержит флажок. Флажок может быть проверен/снят флажок пользователем. Затем значения TreeNode userObject's установлены основа на состоянии этих флажков. Но, от текущего JTree разрабатывают, это невозможно - так как существует только один экземпляр JCheckBox и только используется, чтобы показать, как Ячейка похожа (Вы не можете действительно проверить его). В некотором смысле я хочу разделить выбор TreeCell и проверку полей.

У меня есть некоторые обходные решения (реализующий MouseAdapter и проверяющий, рядом ли щелчок мышью, где флажок представляется, затем эмулируйте проверку на поле путем изменения его появления в TreeCellRenderer), но тем не менее я хочу знать, может ли это быть сделано более непосредственно.Спасибо!

1
задан trashgod 8 July 2010 в 06:23
поделиться

1 ответ

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

Это хороший пример паттерна flyweight.

Для дерева флажков мне нравится org.netbeans.swing.outline.Outline, упомянутый здесь, но доступны и другие примеры.

Дополнение: Читая свой вопрос более внимательно, вы спрашиваете:

В некотором смысле я хочу разделить выделение TreeCell и проверку ячеек.

Это правильная интуиция: данные (отмеченные или не отмеченные) должны храниться в модели (TreeModel), а не в представлении (JCheckBox). Пример пример использует экземпляры CheckBoxNode в своей (неявной) модели, соответственно.

2
ответ дан 2 September 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: