既是父类又是子类的ButtonListener()如何工作?

时间:2018-12-26 22:19:40

标签: java swing user-interface awt actionlistener

我有一个学校的高潮项目,其中必须包含我本学期所学的尽可能多的内容,其中两个是方法和gui。在我要制作的程序中,在父类和子类中都存在一个ButtonListener,但是在上一行的父类中有一个错误:nameConfirm.addActionListener(new ButtonListener()),这表明ButtonListener无法解析为一个类型。我知道这与层次结构有关,但是我不知道应该如何解决。

我有一个模糊的想法,就是有些人使用“ this”或“ override”,但我并不真正理解它们的工作原理。

这是父类:

public void startGame() {
    JPanel namePanel = new JPanel();
    JButton nameConfirm = new JButton("ask");
    nameConfirm.addActionListener(new ButtonListener());
    namePanel.add(nameConfirm);
    setContentPane(namePanel);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(800, 175);
    setResizable(false);
    setLocationRelativeTo(null);
    class ButtonListener implements ActionListener {
    }
}

这是子类:

public cpt2() {
    JPanel startingPanel = new JPanel();
    JPanel buttonPanel = new JPanel();
    newGame = new JButton("New Game");
    newGame.addActionListener(new ButtonListener());
    buttonPanel.add(newGame);
    checkStats = new JButton("Statistics");
    checkStats.addActionListener(new ButtonListener());
    buttonPanel.add(checkStats);
    exit = new JButton("Exit");
    exit.addActionListener(new ButtonListener());
    buttonPanel.add(exit);
    startingPanel.add(buttonPanel);
    setContentPane(startingPanel);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(1110, 375);
    setResizable(false);
    setLocationRelativeTo(null);
public class ButtonListener extends JFrame implements ActionListener{
    public void actionPerformed(ActionEvent a) {
        if (a.getSource() == newGame){
            cptRun.startGame(); 

        }
        else if (a.getSource() == checkStats){

        }
        else if (a.getSource() == exit){
            System.exit(0);
        }
    }
}
}

我希望摆脱该错误,并在父类和子类中为不同的JPanel提供工作按钮。

1 个答案:

答案 0 :(得分:0)

  

这是父类

这是一种方法,并且您已在方法中内联class

更常见的方法是

nameConfirm.addActionListener(new ActionListener() {
    // Implement ActionListener methods here, within anonymous class
});

或将匿名类移至变量

final ActionListener buttonListener = new ActionListener() {
    // Implement ActionListener methods here, within anonymous class
};
nameConfirm.addActionListener(buttonListener);
  

这是子类

目前尚不清楚这是哪个班级。您有一个构造函数cpt2public class ButtonListener extends JFrame implements ActionListener

例如,我想您想要的是

public class Cpt2Frame extends JFrame implements ActionListener {
    public Cpt2Frame() {
        // some button
        someButton.addActionListener(Cpt2Frame.this); // 'this' class 'is-a' ActionListener
    }

    // Implement ActionListener methods within defined class
}

或者您可以创建一个单独的文件 ButtonListener.java,该文件不应是JFrame,而应是侦听器接口

public class ButtonListener implements ActionListener {

}

然后,您可以进行addActionListener(new ButtonListener())