Я пишу пользовательский компонент Swing (что-то совершенно новое, но подумайте JTree или JList). Я пытаюсь следовать общей структуре JTree, JTable, JList и т. Д. Для согласованности (я также видел, как различные плохие сторонние компоненты отказываются от разделяемой модели и / или подхода рендеринга).
Итак, у меня есть модель, полная узлов, самого компонента и средства визуализации. В какой-то момент узел должен быть превращен в текст и отображен средством визуализации. Я не знаю, как лучше это сделать:
- Передайте сам узел (как объект) средству визуализации, и пусть средство визуализации решит, как его отобразить.
- Вот как это делает JList.
- Требуется настраиваемое средство визуализации только для изменения текста.
- Обеспечивает большую гибкость при отображении узла (даже не обязательно должен быть текстом).
- Передайте сам узел (как объект) в средство визуализации, но у вас есть метод convertValueToText () в классе компонента.
- Вот как это делает JTree.
- Рендереры могут быть такими же гибкими, как и раньше, - не имеют для использования этого метода.
- Необходимо изменить компонент, чтобы изменить преобразование текста.
- Как и выше, но делегировать функцию convertValueTotext () модели.
- Вот как это делает JXTable.
- Модель, вероятно, является лучшим местом для этого метода - и там легче переопределить.
Я не хочу настраивать рендерер только для изменения текста, но я бы хотел иметь возможность настраивать рендерер так, чтобы он делал больше, чем отображение отображаемой модели строки (иначе зачем возиться с рендерерами). Мне действительно не нравится тот факт, что JXTable использует отражение для поиска convertValueToText () в модели - это пахнет плохой магией для меня.
Может ли кто-нибудь пролить свет на эту заброшенную часть Swing?
РЕШЕНИЕ
Я закончил тем, что сделал:
- Добавить метод к модели, который возвращает строку для данного узла. Важно отметить, что это может быть нулевым, чтобы указать, что средство визуализации должно знать, что делать, или что мы просто не можем предоставить ничего полезного.
- Компонент имеет тот же метод и передает вызов модели. Это важно для разделения вида и модели. Средство визуализации вызывает этот метод, поэтому он не обращается к модели напрямую.
- Средство визуализации по умолчанию вызывает вышеуказанный метод и, если оно не равно нулю, оно использует его, в противном случае оно может вызвать toString для значения или предоставить значение по умолчанию или что-то еще.
Это оставляет разработчикам выбор, когда они хотят переопределить отображаемое значение
- Замените метод ненулевым возвращаемым значением, зная, что средство визуализации по умолчанию будет отображать этот текст.
- Предоставьте пользовательский рендерер, которому передается реальный объект узла, чтобы он мог делать «умные» вещи, если это необходимо.
Я вполне доволен этим - он чувствует себя хорошо, работает и им легко пользоваться.
Спасибо за ваши перспективы!