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 предоставляет получатель и установщик, но для всех списков предоставляется только получатель, поскольку он дает ссылку на внутренний список, который теперь можно изменить.

увидеть

Другие вопросы по тегам