Могут ли две JButton иметь одинаковую функцию события щелчка мышью?

#java #swing #listener #jbutton

#java #swing #прослушиватель #jbutton

Вопрос:

Я разрабатываю калькулятор на языке Java. Проблема в том, что я поместил десять кнопок для цифр (0,1,2 .. 9), и я хочу, чтобы при нажатии на одну из них все выполняли одну и ту же функцию щелчка мышью. Возможно ли это? В netbeans это не позволяет мне этого сделать, или я не смог достичь. Спасибо за помощь.

Комментарии:

1. Не используйте MouseListeners для JButtons, за исключением некоторых необычных обстоятельств. Как видно из ответа, используйте ActionListeners.

2. ну, я сомневаюсь, что вы хотите, чтобы слушатель делал одно и то же для всех кнопок 😉

3. @Overbose — да, конечно, иногда нам всем хочется перенестись назад во времени и снова использовать ассемблер кода 😉 Если переход к более низкой абстракции приводит к дублированию, что-то серьезно не так с архитектурой программы

4. @Overbose — нет, действие не одинаковое, оно «расширенное» 🙂 У него есть состояние, к которому привязано соответствующее состояние кнопки, и гарантия синхронизации состояния кнопки.

5. @kleopatra: да, вы right..in проверяя свой код, я заметил, что расширяю AbstractAction

Ответ №1:

ДА. Добавьте один и тот же прослушиватель к обеим кнопкам, которые вы используете. Например, предположим, что вы используете ActionListener, тогда:

 public class ListenerClass implements Action{

     @override 
     public void actionPerformed(ActionEvent e) {
         //here retrieve information on which button has generated the event
     }
}

ListenerClass listener = new ListenerClass();
JButton first = new JButton(); 
JButton second = new JButton();
first.addActionListener(listener);
second.addActionListener(listener);
  

Комментарии:

1. 1 специально для использования прослушивателя, который работает как для мыши, так и для клавиатуры.

2. 1 за использование прослушивателя, который неактивирован, если JButton был отключен.

3. @kleopatra не могли бы вы, пожалуйста, пояснить, почему использование Action более уместно? Я не совсем ясно понимаю, почему? Пока я вижу, что вы можете использовать и то, и другое одним и тем же способом. Пожалуйста, поправьте меня и дайте ссылку на ресурс, который помог бы мне, наконец, получить это раз и навсегда 🙂

4. @kleopatra большое спасибо, вы совершенно правы. Действие должно использоваться всегда. Особенно, если вы действительно хотите использовать его так, как если бы это был ActionListener (т. е. игнорируя его состояние), вы можете вызвать addActionListener() вместо setAction(). Не знал об этом — по-видимому, я, должно быть, проигнорировал раздел Action как такой же, как ActionListener при чтении документа.

5. @0verbose вам следует серьезно отредактировать код в вашем ответе. 0) в ListenerClass отсутствует слово class впереди. 1) методы прослушивателя являются общедоступными, и переопределение аннотации не повредит. 2) используйте действие. 3) Все это полезно для практики и рекламы хороших привычек. Я понимаю, что некоторые из этих ошибок являются результатом быстрого набора текста вне IDE, но теперь, когда время не поджимает 🙂 пожалуйста, внесите исправления до тех пор, пока не будет -1.