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
, который я предполагаю, является более быстрым способом, если любое из двух решений является более быстрым.