Как интегрировать элементы GUI из разных классов во время выполнения? - PullRequest
2 голосов
/ 21 марта 2010

Я пытаюсь «написать на будущее» приложение, которое я пишу, выделяя те элементы, которые могут со временем измениться. В моем приложении мне нужно иметь возможность адаптироваться к изменениям в формате вывода (например, сегодня я выводлю в файл CSV, в будущем мне может потребоваться вывод непосредственно в базу данных SQL Server или в веб-службу и т. Д.) .

Я обрабатываю это, определяя абстрактный класс («OutputProvider»), который я буду подклассом для каждого отдельного случая. Один аспект этого, который меня озадачил, - это как предоставить графический интерфейс конфигурации, специфичный для каждого конкретного класса. У меня есть диалог настроек с вкладкой для настройки вывода. На этой вкладке я собираюсь предоставить раскрывающийся список для выбора провайдера и JPanel под ним для хранения содержимого графического интерфейса конкретного провайдера. Как получить правильный графический интерфейс в этой панели во время выполнения и правильно ли он вести себя в отношении событий?

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

Я использую NetBeans и Swing.

Ответы [ 4 ]

1 голос
/ 22 марта 2010

Это похоже на хороший пример стратегии . Вы можете определить OutputProviderStrategy с помощью таких методов, как getOutputPanel().

1 голос
/ 21 марта 2010

Мне кажется идеальным Шаблон дизайна фабрики Кандидат например Вы, кажется, хотите назвать что-то вроде этого (в псевдокоде: ´)

//get the writer responsible for storing to any media ... 
Writer objWriter = new Writer ( configForCsvOrDb ) ; 
//perform the actual write according to the type of storage
objWriter.Write(objToWrite ) ; 
1 голос
/ 22 марта 2010

Решение Адриана это хорошо.Просто расширьте ваш OutputProvider, чтобы назначить следующие два метода:

/**
 * returns a JPanel that shows configuration options for this outputprovider,
 * after initializing the JPanel with current output options
 */
public JPanel getConfigurationPanel();
/**
 * configures output options using values in configPanel, previously 
 * requested through getConfigurationPanel
 */
public void configureFromPanel(JPanel configPanel) throws BadConfigException;

и включить возвращенный JPanel в соответствующее поле диалогового окна конфигурации вывода.Когда пользователь нажимает кнопку «принять», вызывается configureFromPanel().

1 голос
/ 21 марта 2010

Возможно, вы могли бы иметь абстрактный метод в своем классе OutputProvider, который возвращает JPanel, содержащий параметры конфигурации для этого поставщика. Если вы хотите отделить больше, то вместо возврата JPanel метод может вернуть имя класса / класса. Затем экземпляр может быть создан во время выполнения.

Этот вопрос может ответить на вторую часть вашего вопроса.

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