我如何实现ActionListener与非抽象类?Java



我最近刚开始学习如何使用swing,并一直遵循我在网上找到的教程。我基本上遵循了教程"逐字逐句",但我得到了错误:

ScoreBoard不是抽象的,也不覆盖抽象方法actionPerformed(ActionEvent) in ActionListener

所以我的问题是,我怎么能实现ActionListener到我的类(ScoreBoard)如果类不是抽象的?

下面是整个代码:(因为我不知道问题可能在哪里)

package scoreboard;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class ScoreBoard implements ActionListener{
//Class Variables
int redScore = 0;
int blueScore = 0;
//Class Objects
JPanel titlePanel, scorePanel, buttonPanel;
JLabel redLabel, blueLabel, redLabelT, blueLabelT;
JButton redButton, blueButton, resetButton;

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable(){
        public void run(){
            createFrame();
        }
    });
}//End Method
public static void createFrame(){
    JFrame frame = new JFrame("ScoreBoard");
    JFrame.setDefaultLookAndFeelDecorated(true);
    ScoreBoard panel = new ScoreBoard();
    frame.setContentPane(panel.contentPane());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setSize(250, 190);
    frame.setVisible(true);
}//End Method
public JPanel contentPane(){
    JPanel basePanel = new JPanel();
    basePanel.setLayout(null);
    basePanel.setBackground(Color.black);
    //Title
    titlePanel = new JPanel();
    titlePanel.setLayout(null);
    titlePanel.setOpaque(false);
    titlePanel.setLocation(10, 0);
    titlePanel.setSize(250, 30);
    basePanel.add(titlePanel);
    redLabelT = new JLabel("Red Team");
    redLabelT.setLocation(0, 0);
    redLabelT.setSize(100, 30);
    redLabelT.setForeground(Color.red);
    redLabelT.setHorizontalAlignment(0);
    titlePanel.add(redLabelT);
    blueLabelT = new JLabel("Blue Team");
    blueLabelT.setLocation(120, 0);
    blueLabelT.setSize(100, 30);
    blueLabelT.setForeground(Color.blue);
    blueLabelT.setHorizontalAlignment(0);
    titlePanel.add(blueLabelT);
    //Score
    scorePanel = new JPanel();
    scorePanel.setLayout(null);
    scorePanel.setOpaque(false);
    scorePanel.setLocation(10, 40);
    scorePanel.setSize(250, 30);
    basePanel.add(scorePanel);
    redLabel = new JLabel("" + redScore);
    redLabel.setLocation(0, 0);
    redLabel.setSize(100, 30);
    redLabel.setForeground(Color.white);
    redLabel.setHorizontalAlignment(0);
    scorePanel.add(redLabel);
    blueLabel = new JLabel("" + blueScore);
    blueLabel.setLocation(120, 0);
    blueLabel.setSize(100, 30);
    blueLabel.setForeground(Color.white);
    blueLabel.setHorizontalAlignment(0);
    scorePanel.add(blueLabel);
    //Buttons
    buttonPanel = new JPanel();
    buttonPanel.setLayout(null);
    buttonPanel.setOpaque(false);
    buttonPanel.setLocation(10, 80);
    buttonPanel.setSize(250, 70);
    basePanel.add(buttonPanel);
    redButton = new JButton("Red Score");
    redButton.setLocation(0, 0);
    redButton.setSize(100, 30);
    redButton.addActionListener(this);
    buttonPanel.add(redButton);
    blueButton = new JButton("Blue Score");
    blueButton.setLocation(120, 0);
    blueButton.setSize(100, 30);
    blueButton.addActionListener(this);
    buttonPanel.add(blueButton);
    resetButton = new JButton("Reset");
    resetButton.setLocation(0, 40);
    resetButton.setSize(220, 30);
    resetButton.addActionListener(this);
    buttonPanel.add(resetButton);
    return basePanel;
   }//End Method
public void actions(ActionEvent e){
    if(e.getSource() == redButton){
        redScore ++;
        redLabel.setText("" + redScore);
    }else if(e.getSource() == blueButton){
        blueScore++;
        blueLabel.setText("" + blueScore);
    }else if(e.getSource() == resetButton){
        redScore = 0;
        blueScore = 0;
        redLabel.setText("" + redScore);
        blueLabel.setText("" + blueScore);
    }
}//End Method
}//End Class

如果你能解释什么是抽象类,那也会有帮助,但我真的只需要知道如何让JButtons工作现在…

谢谢!

编译器正在抱怨,因为您的类不是抽象的,但它没有实现一个或多个声明要实现的方法(特别是ActionListeneractionPerformed方法)。我认为你只需要重命名你的actions方法:

<罢工>

public void actions(ActionEvent e){. . .

public void actionPerformed(ActionEvent e){. . .

将此方法放入ScoreBoard类-

@Override
public void actionPerformed(ActionEvent ae) {
     // do something
}

如果你不想让ScoreBoard类实现ActionListener,你也可以用这种方式添加listener

redButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent ae) {
         // do something
    }
};

如果你想共享监听器,创建它的实例,并把它添加到所有的按钮。

要了解抽象类,请阅读http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

检查ActionListenerabstract方法是否全部实现。

您缺少void actionPerformed(ActionEvent e)的定义

最新更新