1

所以我得到了错误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);

}'
4

3 回答 3

6

问题不在您发布的原始代码段中。您的课程Clock没有实现actionPerformed(). taskPerformer对象确实如此。但是代码抱怨这taskPerformer是一个ActionListener但时钟不是。

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

我看到两种方法来处理这个问题。(我省略了一些不相关的代码以使技术更清晰)。

选项 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);    
    }
}
于 2013-09-15T15:21:56.143 回答
1

替换ActionEvent ejava.awt.event.ActionEvent e如下:

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

为我工作。

于 2016-10-06T19:31:50.067 回答
0

一个简单的说法是,如果一个类实现了 ActionPerformed,那么该动作必须在该类的边界内执行。

于 2014-03-26T21:40:42.510 回答