Использование статических фабричных классов для создания компонентов графического интерфейса. Как и где добавить необходимые слушатели?

Я хотел бы использовать фабричные классы и методы для создания компонентов GUI, но я не знаю, как и в каком классе должны быть объявлены и добавлены к компонентам различные слушатели.

Если у меня есть простой фабричный класс, такой как указанный ниже, я должен добавить ActionListener к кнопке, прежде чем она будет возвращена вызывающему классу. Если ответ «Да», то как мне добавить слушателя?

class GUIFactory
{
    public static JButton getJButton()
    {
        JButton aButton = new JButton();
        return aButton; 
    }
}

Предположим, я хочу использовать метод getJButton() для добавления 5 кнопок в графический интерфейс. Как мне закодировать ActionListener, чтобы он знал, какая кнопка была нажата?

Или слушатели должны быть добавлены в вызывающий класс?

JFrame gui = new JFrame();
gui.add(AppFactory.getJButton());

Я пробовал следующее

gui.add(GUIFactory.getJButton().addActionListener(new guiButtonListener()));

и получил ошибку:

Тип "void" здесь недопустим.


person The Thing    schedule 22.08.2010    source источник
comment
Каковы ваши намерения при использовании Factory? Но если вы хотите использовать фабрику, вам следует рассмотреть возможность возврата более распространенных классов, таких как AbstractButton, из метода, чтобы быть более гибким, если вы действительно меняете возвращаемый компонент.   -  person Johannes Wachter    schedule 23.08.2010
comment
Кроме того, если вы хотите создать свои компоненты, используя цепочку методов, вы можете рассмотреть шаблон Builder.   -  person Johannes Wachter    schedule 23.08.2010
comment
Здравствуйте, Йоханнес. Мое намерение состояло в том, чтобы создать модульный графический интерфейс на основе JFrame для моего приложения. В прошлом мои графические интерфейсы почти всегда были построены в одном классе, и я хотел уйти от этого к более многоразовому способу выполнения действий. Честно говоря, у меня нет никакого опыта реализации шаблонов, фабрик и т. д. На самом деле, первое, что я узнал о них, было здесь, на SO, когда я просматривал вопросы, связанные с java. Образцы кода, которые я разместил, были моей первой попыткой, основанной на образцах других людей, размещенных здесь здесь, на SO. Спасибо за предложение шаблона Builder.   -  person The Thing    schedule 24.08.2010


Ответы (1)


Это потому, что addActionListener возвращает пустоту. Пытаться:

JButton button = GUIFactory.getJButton();
button.addActionListener(new guiButtonListener())
gui.add(button);

Имейте в виду, что программирование Swing GUI довольно идиоматично. Некоторые могут предпочесть использовать связывание компонентов (или другое решение для связывания) для соединения представлений и моделей с друг с другом. Кто-то может возразить, что использование Шины событий дает наилучшие низкосвязанные компоненты графического интерфейса с высокой степенью повторного использования. Взгляните также на инфраструктуру приложений Swing (теперь она устарела, но BSAF в очень хорошем состоянии) и инфраструктура GUTS.

Вы увидите, что было много попыток решить проблемы программирования и дизайна графического интерфейса. Тема очень широкая, и решения сильно различаются.

О, и две большие платформы Swing Rich Content (NetBeans RCP, Eclipse RCP) имеют очень специфические API для работы с графическими интерфейсами. Например, NetBeans RCP использует Поиск, Узлы и Windows API для защиты разработчиков от проблем с Swing. Команда Eclipse отказалась от Swing и написала собственный инструментарий SWT GUI. Возможно, вы захотите посмотреть учебные пособия, если вам нужны отличные ссылки на дизайн.

person Rekin    schedule 22.08.2010
comment
Eclipse RCP не основан на Swing! - person Johannes Wachter; 23.08.2010
comment
Привет, Рекин. Спасибо за ответ - я мог ударить себя ногой, когда увидел ваш пример кода :-) У меня нет опыта использования фабрик, поэтому я просто пробовал свои силы на основе других примеров кода, которые я читал здесь, на SO Спасибо. - person The Thing; 24.08.2010