如何在没有内部类的情况下实现多个动作侦听器?

时间:2015-01-13 15:08:34

标签: java swing awt

我对Java很陌生,我想知道是否可以在同一个类中使用多个动作侦听器(例如在使用多个JButton对象时)而不使用内部类。提前谢谢。

3 个答案:

答案 0 :(得分:2)

是。这是可能的。您可以在类路径中仅使用外部类实现ActionListener(s),或在Java 8中使用lambdas实现。

public class MyListener implements ActionListener {
  // ..
}

然后像

btn.addActionListener(new MyListener());

或(使用Java 8+)lambda like

btn.addActionListener(ae -> { System.out.println("Button Clicked"); });

答案 1 :(得分:1)

使用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表达式仅支持一个侦听器方法。

答案 2 :(得分:0)

是的,您可以创建自己的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有自定义行为。