JList и ListModel советы по шаблону проектирования
Я создаю приложение, которое в основном представляет собой графический интерфейс для отображения и редактирования одного объекта. Так как класс для этого объекта был создан с помощью JAXB, это в основном дерево с множеством строк и целых чисел в качестве дочерних, но есть и некоторые List<E>
s. Для каждого простого дочернего элемента JAXB предоставляет метод получения и установки, но для всех списков предоставляется только метод получения, так как он дает ссылку на внутренний список, который теперь можно изменить.
Поскольку мне нужно отобразить каждый дочерний элемент (и, соответственно, ветвь) в отдельном компоненте графического интерфейса Swing, мне нужны эти представления для обработки некоторых данных. Согласно моим текущим знаниям о шаблоне проектирования контроллера представления модели, я должен строго отделить модель от представления. После этого было бы неплохо позволить JList
работать напрямую с внутренним списком моего базового объекта. (На самом деле это было бы довольно простым решением для моего конкретного случая использования, но, поскольку в дальнейшем могут быть добавлены дополнительные функции, я думаю, что мне следует воздерживаться от этой идеи.)
Тогда я начал думать: если я не позволю компонентам работать непосредственно со списком, я должен заставить их использовать копию оригинала. Но так как я не могу установить исходный список на новый, возвращаемый моим компонентом GUI, я должен скопировать элементы в другой раз при сохранении данных вида в моей модели. Кроме того, было бы неразумно раздавать ссылки на внутренние списки ListModel
Это означает, что в зависимости от глубины структуры GUI, список может быть скопирован дополнительные времена.
Поскольку я также хочу, чтобы мое приложение было эффективным, это также не похоже на правильный подход. Как мне построить это "правильно"?
Резюме:
List<E>
Исходный объект является ссылкой на внутренний список объекта.JList
отображение списка не должно получать эту ссылку, следовательно, оно должно копировать список.Получение списка из
JList
также не должен давать ссылку на внутренний список, поэтому его необходимо скопировать снова.Сохранение списка в исходном объекте должно копировать список в третий раз, поскольку исходный объект не имеет метода установки для списка. (подробности см. выше)
Правильно ли я понимаю это? Как мне построить это правильно и сделать его эффективным?
PS: Добавление методов установки в исходную структуру класса не вариант!
2 ответа
Все компоненты, предложенные @mKorbel, предоставляют некоторый слушатель выбора, который позволит вам свободно связывать выбор на одной панели с отображением выбранного элемента на другой. FileBrowser
иллюстрирует TreeSelectionListener
; Outline
может иметь ListSelectionListener
, показанный здесь; и т.п.
Приложение: В этом связанном примере DisplayPanel
слушает соседний TableModel
, который он может запросить, чтобы обновить модель в одном из своих компонентов. Обратите внимание, что каждая модель слабо связана с соответствующим видом. Общие механизмы уведомления упоминаются здесь.
был создан с
JAXB
, это в основном дерево с множеством строк и целых чисел в качестве детей, но есть и некоторыеList<E>
s. Для каждого простого ребенкаJAXB
предоставляет получатель и установщик, но для всех списков предоставляется только получатель, поскольку он дает ссылку на внутренний список, который теперь можно изменить.
увидеть