如何在没有内部 类 的情况下实现多个动作监听器?
How to implement multiple actions listeners without inner classes?
我是 Java 的新手,我想知道是否可以在同一个 class 中使用多个动作侦听器(例如,在使用多个 JButton 对象时)而不使用 inner class是的。提前谢谢你。
是的。这是可能的。您可以在类路径上仅使用外部 类 或在 Java 8.
中使用 lambda 来实现 ActionListener
(s)
public class MyListener implements ActionListener {
// ..
}
然后是
btn.addActionListener(new MyListener());
或(使用 Java 8+)像
这样的 lambda
btn.addActionListener(ae -> { System.out.println("Button Clicked"); });
是的,您可以创建自己的 MyButton
对象,该对象 扩展 JButton
和 实现 ActionListener
然后用它代替简单的 JButton
:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class MyButton extends JButton implements ActionListener
{
public MyButton() {
super();
addActionListener(this);
}
@Override public void actionPerformed(ActionEvent e) {
// do something
}
}
现在 MyButton
具有自定义行为。
使用 Java 8,您可以使用 lambda 表达式实现侦听器,如下所示:
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JTextField;
public class ActionListenerExample {
ActionListenerExample() {
JTextField tf=new JTextField();
tf.addActionListener(ev -> textAction(tf));
JButton b=new JButton();
b.addActionListener(this::buttonClicked);
}
private void textAction(JTextField tf) {
}
private void buttonClicked(ActionEvent ev) {
}
}
但甚至在 Java 8 之前就有一个动态生成侦听器的选项:
import static java.beans.EventHandler.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JTextField;
public class ActionListenerExample1 {
ActionListenerExample1() {
JTextField tf=new JTextField();
tf.addActionListener(create(ActionListener.class,this,"textAction","source"));
JButton b=new JButton();
b.addActionListener(create(ActionListener.class, this, "buttonClicked", ""));
}
public void textAction(JTextField tf) {
System.out.println(tf);
}
public void buttonClicked(ActionEvent ev) {
System.out.println(ev);
}
}
它具有较高的开销并且缺乏编译时安全性,但另一方面,它可以生成具有多种侦听方法的侦听器,而 lambda 表达式仅支持一种侦听器方法。
我是 Java 的新手,我想知道是否可以在同一个 class 中使用多个动作侦听器(例如,在使用多个 JButton 对象时)而不使用 inner class是的。提前谢谢你。
是的。这是可能的。您可以在类路径上仅使用外部 类 或在 Java 8.
中使用 lambda 来实现ActionListener
(s)
public class MyListener implements ActionListener {
// ..
}
然后是
btn.addActionListener(new MyListener());
或(使用 Java 8+)像
这样的 lambdabtn.addActionListener(ae -> { System.out.println("Button Clicked"); });
是的,您可以创建自己的 MyButton
对象,该对象 扩展 JButton
和 实现 ActionListener
然后用它代替简单的 JButton
:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class MyButton extends JButton implements ActionListener
{
public MyButton() {
super();
addActionListener(this);
}
@Override public void actionPerformed(ActionEvent e) {
// do something
}
}
现在 MyButton
具有自定义行为。
使用 Java 8,您可以使用 lambda 表达式实现侦听器,如下所示:
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JTextField;
public class ActionListenerExample {
ActionListenerExample() {
JTextField tf=new JTextField();
tf.addActionListener(ev -> textAction(tf));
JButton b=new JButton();
b.addActionListener(this::buttonClicked);
}
private void textAction(JTextField tf) {
}
private void buttonClicked(ActionEvent ev) {
}
}
但甚至在 Java 8 之前就有一个动态生成侦听器的选项:
import static java.beans.EventHandler.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JTextField;
public class ActionListenerExample1 {
ActionListenerExample1() {
JTextField tf=new JTextField();
tf.addActionListener(create(ActionListener.class,this,"textAction","source"));
JButton b=new JButton();
b.addActionListener(create(ActionListener.class, this, "buttonClicked", ""));
}
public void textAction(JTextField tf) {
System.out.println(tf);
}
public void buttonClicked(ActionEvent ev) {
System.out.println(ev);
}
}
它具有较高的开销并且缺乏编译时安全性,但另一方面,它可以生成具有多种侦听方法的侦听器,而 lambda 表达式仅支持一种侦听器方法。