GUI: изменение панелей в зависимости от значения поля со списком - PullRequest
2 голосов
/ 15 июня 2009

У меня есть вопрос о дизайне графического интерфейса, особенно с Java Swing и создании четкого разделения между презентацией и моделью.

Это немного сложно описать, но по сути у нас есть много справочных данных в нашей системе (то есть, которые соответствуют таблицам поиска в БД). Мы хотим, чтобы люди могли редактировать их все с одного экрана.

Итак, в идеальном мире нам бы хотелось, чтобы в верхнем левом углу было поле со списком «типов» справочных данных (то есть каждому соответствует одна таблица в БД).

Затем, когда выбрано, список данных заполняется ниже, также фильтр (или поле поиска). Когда выбран один из этих элементов, активируется панель справа, которая позволяет редактировать фактические данные.

Теперь вот проблема: каждый тип данных, который нам нужно отредактировать, отличается, поэтому у него разные поля и т. Д. Мы могли бы использовать общее решение, но я не очень их люблю - есть много разных правила проверки для каждого и т. д., даже для разных клиентов, и управлять им было бы кошмаром.

Мы используем шаблон Presentation Model , чтобы достичь некоторой степени разделения между кодом GUI и моделью, но я не могу придумать чистый способ сделать это, который каким-то образом не размывает линию немного ответственности.

Как вы решаете подобные проблемы?

[Примечание: извиняюсь за длинный вопрос, надеюсь, это понятно, я могу перефразировать при необходимости]

Ответы [ 2 ]

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

Вы можете использовать Factory Pattern , чтобы создать виджет пользовательского интерфейса для выбранного элемента. Вы также можете использовать его для создания объекта правила проверки в зависимости от типа. Это даст вам некоторую гибкость, которую вы желаете.

Так что вы можете иметь что-то вроде:

IWidget widget = UIFactory.createFor(myObject.getType())

Это можно вызвать в событии выбора, чтобы создать правильный виджет для редактирования выбранного элемента.

IWidget может иметь такие методы, как:

validateData()
refreshData()
setDataElement(IDataElement element)

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

Я использовал это решение, связанное с механизмом расширения Eclipse, для добавления новых элементов пользовательского интерфейса в мое «базовое» решение, чтобы иметь расширяемое ядро ​​и высокий уровень повторного использования. Вы могли бы достичь чего-то подобного, внедряя типы и виджеты в свою фабрику, либо вручную, либо с помощью Spring.

0 голосов
/ 15 июня 2009

Если вы не хотите идти по общему пути, ваша модель может содержать отображение элемента комбинированного списка -> имя панели для использования с CardLayout . Затем вы можете создать пользовательские панели для редактирования каждого из типов ссылочных данных. При изменении выбора в поле со списком вы можете сохранить текущее состояние в вашей модели, запросить имя панели текущего выбора, подготовить следующую панель для отображения и затем показать ее в CardLayout.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...