“AbstractButton 类型中的方法 addActionListener(ActionListener) 不适用于参数”错误

Posted

技术标签:

【中文标题】“AbstractButton 类型中的方法 addActionListener(ActionListener) 不适用于参数”错误【英文标题】:"The method addActionListener(ActionListener) in the type AbstractButton is not applicable for the arguments" error 【发布时间】:2020-06-28 19:57:35 【问题描述】:

我想创建一个JFrame,它会在控制台上打印出来:“它有效!!”当您单击JButton 时。下面是代码:

import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;

public class CurrentlyMajorCodesCompiler extends JFrame 

public static void main (String args[]) 
CurrentlyMajorCodes CMC = new CurrentlyMajorCodes();

CMC.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);



public class CurrentlyMajorCodes extends JFrame 

private JButton ClickSpeedTest;
private tensCPS TCPS;

public CurrentlyMajorCodes () 
    super("Major Code Compiler");
    setLayout(new FlowLayout());

    ClickSpeedTest = new JButton("Click Speed Test");
    add(ClickSpeedTest);

    ClickSpeedTest.addActionListener(new MouseAdapter () 
        public void mouseClicked (MouseEvent event) 
            System.out.println("It works!!");
        
    );

    setSize(250, 250);
    setVisible(true);


但是,在:ClickSpeedTest.addActionListener,它给了我一个错误提示:

The method addActionListener(ActionListener) in the type 
    AbstractButton is not applicable for 
    the arguments (new MouseAdapter())`

我不明白它试图传达什么,因为我从未在代码中使用过AbstractButton,甚至不知道它是什么。有人可以帮忙吗?

【问题讨论】:

JButton 扩展了 AbstractButton,它有 addActionListener 方法。 【参考方案1】:

MouseListener 与 ActionListener 不同。你需要使用后面的

ClickSpeedTest.addActionListener(new ActionListener () 
    public void actionPerformed (ActionEvent event) 
        System.out.println("It works!!");
    
);

【讨论】:

有什么区别? MouseListener 封装了鼠标引起的所有事情(移动、拖动、单击、进入、退出)。 ActionListener 用于单击按钮,但也用于从键盘或其他输入启动操作【参考方案2】:

AbstractButton 类中的方法addActionListener() 采用单个参数,即实现接口ActionListener 的类的实例。 JButton 类扩展了 AbstractButton,因此继承了此方法。

现在查看MouseAdapter 类。您会看到它没有实现接口 ActionListener,因此不适合作为方法 addActionListener() 的参数。

对于您问题中描述的要求,我建议您创建自己的接口ActionListener 实现。下面和你贴的代码类似,使用匿名内部类实现接口ActionListener

ClickSpeedTest.addActionListener(new ActionListener() 
    public void actionPerformed(java.awt.event.ActionEvent event) 
        System.out.println("It works!!");
    
);

请注意,只要按钮ClickSpeedTest 被激活,无论是通过鼠标还是键盘,甚至是通过Java 代码,都会调用上述actionPerformed() 方法。 (参考AbstractButton类中的方法doClick()。)

如果您使用的是 Java 8 或更高版本,那么ActionListener 是一个functional interface,即一个只包含一个抽象方法的接口,因此您可以使用lambda expression 来实现它,这意味着您也可以使用以下代码:

ClickSpeedTest.addActionListener(e -> System.out.println("It works!!"));

【讨论】:

以上是关于“AbstractButton 类型中的方法 addActionListener(ActionListener) 不适用于参数”错误的主要内容,如果未能解决你的问题,请参考以下文章