Как работает ButtonListener (), когда он является одновременно родительским и дочерним классом? - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть кульминационный проект для школы, где я должен включить столько элементов, сколько я выучил в этом семестре, и 2 из них - это методы и руководства.В программе, которую я пытаюсь сделать, в родительском и дочернем классах есть и 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);
        }
    }
}
}

Я надеюсь избавиться от ошибки и иметьрабочие кнопки для разных JPanels как в родительском, так и в дочернем классе.

1 Ответ

0 голосов
/ 27 декабря 2018

Это родительский класс

Это метод , и вы вставили 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);

, и это дочерний класс

Непонятно, какой класс здесь.У вас есть конструктор cpt2 и public 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())

...