有很多方法可以做到这一点。如果你想使用另一个已经实现 ActionListener 的类,那么你绝对可以创建该类的对象,然后插入是这样的:
//Another class that you're already created is named MyActionListener
// and implements ActionListener for this example
MyActionListener mal = new MyActionListener();
JButton start = new JButton ("Play");
frame.add(start);
start.addActionListener(mal);
但是,这可能没有任何意义,因为您需要引用作为当前类实例成员的变量。在这种情况下,您希望当前类像这样实现ActionListener:
class MyClass implements ActionListener {
public MyClass() {
JButton start = new JButton ("Play");
frame.add(start);
start.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
//do whatever you need to do here
}
}
this 关键字表示您指的是该类的当前实例。因此它将使用您在此类中实现的actionPerformed 方法。您可以在 actionPerformed 方法中实例化其他类的对象,然后像往常一样对该对象进行任何调用,或者如果它是此类的成员,则直接调用该成员的函数。此外,如果您在第二个类上引用静态方法,您也可以直接在 actionPerformed 方法中调用它们。
还有另一种选择,即使用匿名内部类。如果您希望在单个类中拥有多个 actionPerformed 方法,这些方法不在不同组件的事件处理程序的注册之间共享(即,仅将其用于单个启动按钮),通常使用此方法。以下是如何使用该方法:
JButton start = new JButton ("Play");
frame.add(start);
start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//do whatever you want here for whenever start is clicked
}
});
与其他选项一样,您也可以在此处实例化 actionPerformed 方法中的第二个类或从另一个类调用静态方法。但是,如果您计划调用位于外部类成员变量上的方法(在这种情况下为MyClass),那么您需要使用此语法this.MyOtherClass.method()。原因是在这种情况下,this 关键字为您提供了访问匿名内部类内部的外部类的权限。