3

私は最近、swingの使い方を学び始め、オンラインで見つけたチュートリアルに従っています。私は基本的に「一言一句」のチュートリアルに従いましたが、エラーが発生します。

ScoreBoardは抽象的ではなく、ActionListenerの抽象メソッドactionPerformed(ActionEvent)をオーバーライドしません

だから私の質問は、クラスが抽象的でない場合、どうすれば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

また、抽象クラスとは何かを説明できれば、それも役に立ちますが、実際には、今のところJButtonを機能させる方法を知る必要があります...

ありがとう!

4

3 に答える 3

4

あなたのクラスは抽象的ではありませんが、実装するように宣言されている 1 つ以上のメソッド (具体的には のメソッド)actionPerformedを実装していないため、コンパイラは不平を言っていますActionListeneractionsメソッドの名前を変更するだけでよいと思います。

public void actions(ActionEvent e){. . .

public void actionPerformed(ActionEvent e){. . .
于 2013-03-22T04:53:25.080 に答える
2

abstractのすべてのメソッドActionListenerが実装されているかどうかを確認する必要があります。

あなたはの定義を逃しています void actionPerformed(ActionEvent e)

于 2013-03-22T04:48:00.417 に答える
2

このメソッドを ScoreBoard クラスに入れます。

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

ScoreBoard クラスに ActionListener を実装させたくない場合は、この方法でリスナーを追加することもできます。

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

リスナーを共有する場合は、そのインスタンスを作成してすべてのボタンに追加します。

抽象クラスについては、http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html を参照してください

于 2013-03-22T04:49:18.527 に答える