ActionListener vs AbstractAction

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

До сих пор я знаю о 2 способах сделать что-то, когда кнопка нажата.

ActionListener:

myButton.addActionListener(new ActionListener() { @override actionPerformed... });

и AbstractAction:

public class MyAction extends AbstractAction {
    public MyAction(String text, ImageIcon icon, String desc, Integer mnemonic) {
        super(text, icon);
        putValue(SHORT_DESCRIPTION, desc);
        putValue(MNEMONIC_KEY, mnemonic);
    }
    public void actionPerformed(ActionEvent e) {
        System.out.println("Action", e);
    }
}

MyAction myAction = new MyAction(...);
myButton.setAction(myAction);

Я знаю, что я могу написать все, что я хочу, чтобы в actionPerfomed() метод.

Но так как я не знаю, что именно происходит в фоновом режиме, я не могу сказать, имеет ли одно преимущество перед другим или какой мне следует использовать в какой ситуации?

1 ответ

Решение

Если вы расширяете AbstractAction, вы не можете расширять другие классы. В любом случае, вы можете избегать подклассов, когда можете. Я бы лично рекомендовал реализовать интерфейс ActionListener и затем добавление слушателя действия к вашему объекту колебания (или тому, что вы слушаете), используя ключевое слово "this".

public class ClassName implements ActionListener {
    private JButton button = new JButton("click me");
    public ClassName() {
        button.addActionListener(this);
    }
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == button) {
            //perform action
        }
    }
}

Конечно, вы также добавляете ActionListenerнапрямую (используя .addActionListener(new ActionListener() {});, но с помощью thisВы можете сгруппировать все действия вместе.

// редактировать: другой способ будет использовать MouseListener, который может прослушивать любые щелчки на вашем объекте, что позволяет вам также использовать объекты качания, такие как JLabel как "кнопки" - однако, если вы используете JButtonsэто было бы ненужным усилием, учитывая, что ActionListener это намного проще в использовании, и вам не нужно создавать много классов (таких как mousePressed, mouseClicked, mouseReleased, так далее.). Однако, если вам все равно нужно MouseListener где-то вы можете подумать об их использовании, чтобы все события были сгруппированы вместе. Примечание: я не знаю, если ActionListener а также MouseListener одинаково быстро, или если один из этих методов лучше! Если ваша программа уже требует много энергии, вы можете использовать ActionListener, который я предполагаю, является более быстрым способом, если любое из двух решений является более быстрым.

Другие вопросы по тегам