Почему у кнопок есть прослушиватели действий, а у команд нет в LWUIT?

Есть ли причина, по которой в LWUIT кнопка может иметь свой собственный прослушиватель действий (через button.addActionListener), а команда — нет?

Единственный способ получить прослушиватель для конкретной команды — это добавить ActionListener в форму и проверить прослушиватель, для какой команды пришло событие, как показано ниже?

    public void startApp() {
    Display.init(this);
    f = new Form("Mixed Record");
    exit = new Command("Exit");
    start = new Command("Start");
    Button button = new Button("Button");

    f.addCommand(exit);
    f.addCommand(start);
    f.addCommand(delete);
    f.addComponent(button);

    f.addCommandListener(new ActionListener() {

        public void actionPerformed(ActionEvent ae) {
            if (ae.getCommand().equals(exit)) {
                //Do Exit command code
            } else if (ae.getCommand().equals(start)) {
                //Do Start command code
            }
        }
    });

    button.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent ae) {
            //Do button code
        }
    });

    f.show();
}

person Boon McBoon    schedule 25.07.2012    source источник


Ответы (1)


Что ж, я не могу точно сказать, почему люди, написавшие LWUIT, приняли такое решение, но есть несколько причин, по которым это имеет смысл.

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

Возможно также, что API формы LWUIT очень похож на форму LCDUI в спецификации MIDP.

Мне также нравится, что ваш код показывает одно положительное последствие решения:

У вас уже есть 2 безымянных внутренних класса (подклассы ActionListener) в вашем коде. Если бы у каждой команды был свой собственный прослушиватель действий, вы, вероятно, написали бы 3 безымянных внутренних класса. Разработчики часто так делают, хотя, потратив немного больше времени на просмотр трассировки стека кода, содержащего несколько неименованных внутренних классов, вы поймете, что иметь более одного класса в каждом именованном классе — плохая практика.

person michael aubert    schedule 25.07.2012
comment
Понимаю. Теперь это имеет смысл .. (вместо того, чтобы просто раздражать). Спасибо за подробный ответ! - person Boon McBoon; 26.07.2012
comment
Команда является прослушивателем действий (вы можете подклассировать ее и написать код в ее методе actionPerformed. Поэтому добавление прослушивателя действий к слушателю действий кажется несколько запутанным косвенным обращением. Вот почему мы этого не сделали (первоначальный соавтор LWUIT) - person Shai Almog; 29.07.2012