ActionListener是抽象的,不会覆盖抽象方法actionPerformed - 尽管包含了这个方法

时间:2013-09-15 14:38:15

标签: java swing override actionlistener abstract

所以我收到错误Class is not abstract and does not override abstract method actionPerformed(ActionEvent) in ActionListener

我知道这个错误的根源,但令我困惑的是我有那个方法。

public static ActionListener taskPerformer = new ActionListener(){
        public void actionPerformed(ActionEvent e){
        Clock cl = new Clock();
        if(seconds<59){
            seconds++;
        }else{
            seconds=0;
            if(minutes<59){
                minutes++;
            }else{
                minutes=0;
                if(hours<12){
                    hours++;
                }else{
                    hours=0;
                }
            }
        }

        cl.repaint();   
    }
};'

不太确定发生了什么。有帮助吗?提前谢谢。

编辑:上下文包括导入和相关方法

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.Object.*;
import java.text.DecimalFormat;
import java.awt.geom.*;


public class Clock extends JFrame implements ActionListener{
public static int seconds = 0;
public static int minutes = 0;
public static int hours = 9;

public static ActionListener taskPerformer = new ActionListener(){
        public void actionPerformed(ActionEvent e){
        Clock cl = new Clock();
        if(seconds<59){
            seconds++;
        }else{
            seconds=0;
            if(minutes<59){
                minutes++;
            }else{
                minutes=0;
                if(hours<12){
                    hours++;
                }else{
                    hours=0;
                }
            }
        }

        cl.repaint();   
    }
};
public static Timer timer = new Timer(1000, taskPerformer);

public static void main(String[] args){
    Clock cl = new Clock();
    init();
    SwingUtilities.invokeLater(new Runnable(){
        public void run() {
            createAndShowGUI();
        }
    });
}
public static void init(){
    timer.start();
}
public Clock() {
    super("Clock");
    timer.addActionListener(this);

}'

3 个答案:

答案 0 :(得分:5)

问题不在您发布的原始代码段中。你的类Clock没有实现actionPerformed()。 taskPerformer对象可以。但代码抱怨taskPerformer是一个ActionListener但Clock不是。

此外,您似乎没有在任何地方使用taskPerformer,那么为什么需要匿名类。你可以在Clock中定义actionPerformed()并完成它。

我认为有两种方法可以解决这个问题。 (我省略了一些不相关的代码以使技术更清晰)。

选项1 - 使用时钟作为听众

    public class Clock extends JFrame implements ActionListener {
    public static int seconds = 0;
    public static int minutes = 0;
    public static int hours = 9;

    public void actionPerformed(ActionEvent e) {
        // code
    }

    public Timer timer;

    public Clock() {
        super("Clock");
        timer = new Timer(1000, this);
        timer.addActionListener(this);    
    }
}

选项2 - 使用匿名侦听器

    public class Clock extends JFrame {
    public static int seconds = 0;
    public static int minutes = 0;
    public static int hours = 9;

    public static ActionListener taskPerformer = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // insert code here
        }
    };

    public static Timer timer = new Timer(1000, taskPerformer);

    public Clock() {
        super("Clock");
        timer.addActionListener(taskPerformer);    
    }
}

答案 1 :(得分:0)

一种简单的推送方式是,如果一个类实现ActionPerformed,则必须在该类边界内执行该操作。

答案 2 :(得分:0)

尝试将java.awt.event添加到您的代码中,如下所示:

   @Override  
   public void actionPerformed(java.awt.event.ActionEvent e) {
   //do something here
   }

有同样的问题。为我工作。