Action vs ActionListener для нескольких кнопок с одной и той же Java

Я хотел бы уточнить свое понимание использования Action вместо ActionListener.

Если у меня есть несколько JButton, для которых требуется выполнение одной и той же функции при нажатии (например, кнопка будет отключена), будет ли использование Action более подходящим для этого?

Если да, то это потому, что вы можете изменить состояние кнопки (например, сделать ее отключенной), установив состояние действия на отключенное?

Разве это невозможно с помощью actionListener?

Ниже приведен код, демонстрирующий приведенный выше пример:

JButton[] button = new JButton[10];

for(int i = 0; i < 10; i++){
    button[i] = new JButton();
    Action buttonAction = new ButtonAction();
    button[i].setAction(buttonAction);  
}

class ButtonAction extends AbstractAction{
    public void actionPerformed(ActionEvent e){
        setEnabled(false);
    }
}

Извините, если я взял не тот конец палки!

Спасибо!


person user1788673    schedule 06.11.2012    source источник
comment
По моему опыту, более распространенной является ситуация, когда вы хотите, чтобы действие было доступно из нескольких типов элементов управления. Например, у меня может быть пункт меню, кнопка на панели инструментов и пункт контекстного меню, вызываемый правой кнопкой мыши, привязанные к одному и тому же Action.   -  person Kevin K    schedule 07.11.2012
comment
один и другой являются обработчиками событий.   -  person Roman C    schedule 07.11.2012


Ответы (2)


Согласно Javadoc:

Интерфейс Action предоставляет полезное расширение для интерфейса ActionListener в случаях, когда одна и та же функциональность может быть доступна нескольким элементам управления.

Так что я согласен с вашим утверждением, что это так.

person hd1    schedule 06.11.2012

Расширение AbstractAction дает вам возможность добавлять дополнительную информацию таким же образом в одной точке вашего кода:

public class NewFileAction extends AbstractAction
{
 /**
   * 
   */
protected NewFileAction()
{
  super("NewFile");
  this.putValue(NAME, "New File");
  this.putValue(SHORT_DESCRIPTION, "New file");
  this.putValue(LONG_DESCRIPTION, "New file");
  this.putValue(SMALL_ICON,ImageIconFactory.getSmallImageIcon(ImageIconFactory.Option.SUN_New24));
}

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

Примечание к вашему примеру: обычно вы не хотите создавать много действий, таких как

Action buttonAction = new ButtonAction();

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

Action buttonAction = new ButtonAction(loopCounter);

В этом случае могут быть полезны многие объекты действий - также loopCounter может перейти к меткам и т. д.

person E.S.    schedule 06.11.2012