«<> не является абстрактным и не переопределяет абстрактный метод keyReleased», хотя keyReleased не используется - PullRequest
0 голосов
/ 16 октября 2018

Я получаю две ошибки при создании этого класса.Первый появляется в:

public class DisplayerDeluxe extends JPanel implements ActionListener, 
KeyListener{

Отображается следующая ошибка компилятора: DisplayerDeluxe is not abstract and does not override abstract method keyReleased(java.awt.event.KeyEvent) in java.awt.event.KeyListener

Следующая ошибка отображается здесь

public void startGame() {
        paintCurrent(0, 0);
        for(int i = 0; i < height; i++) {
            for(int j = 0; j < width; j++) {
                bRef[i][j].addKeyListener(new KeyListener() { //Error is shown here
                        @Override public void keyPressed(KeyEvent e) {
                            mazeBuilder.buildPath();
                            Grid grid = mazeBuilder.getGrid();
                            if(e.getKeyCode() == KeyEvent.VK_UP && getYPos() != 0
                            && !getCell(getXPos(), getYPos(), grid).hasNorth()) {
                                moveUp();
                            }
                            else if(e.getKeyCode() == KeyEvent.VK_DOWN && getYPos() != height - 1
                            && !getCell(getXPos(), getYPos(), grid).hasSouth()) {
                                moveDown();
                            }
                            else if(e.getKeyCode() == KeyEvent.VK_LEFT && getXPos() != 0
                            && !getCell(getXPos(), getYPos(), grid).hasWest()) {
                                moveLeft();
                            }
                            else if(e.getKeyCode() == KeyEvent.VK_RIGHT && getXPos() != width - 1
                            && !getCell(getXPos(), getYPos(), grid).hasEast()) {
                                moveRight();
                            }
                            else {
                                infoBox("Only arrow key input in a dirrection " +
                                    "not blocked by a wall is valid.", "Maze Game");
                            }
                        }
                    });
            }
        }
        infoBox("Welcome to the maze game! Navigate your way to the end by using the arrow keys!", "Maze Game");
    }

Ошибка гласит:<anonymous DisplayerDeluxe$1> is not abstract and does not override abstract method keyReleased(java.awt.event.KeyEvent) in java.awt.event.KeyListener

Это сильно смущает меня, потому что нигде в моем коде я не включаю keyReleased (), а keyPressed () имеет нотацию @Override.Любое понимание этого будет с благодарностью!

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Когда вы объявляете new KeyListener() { ... }, вы создаете так называемый анонимный внутренний класс, который расширяет KeyListener и создает его неназванный экземпляр (следовательно, анонимный).Ошибка сообщает, что ваш анонимный внутренний класс, отображаемый как <anonymous DisplayerDeluxe$1>, не является ни абстрактным, ни реализующим метод keyReleased(java.awt.event.KeyEvent), как описано в java.awt.event.KeyListener.

KeyListener являетсяинтерфейс, который заключает контракт с разработчиками, чтобы обеспечить 3 метода.Это означает, что все классы, включая анонимные внутренние классы, которые реализуют этот интерфейс, должны быть либо абстрактными (и, следовательно, не обязаны предоставлять реализацию), либо конкретным / нормальным классом с предоставленными реализациями.Анонимные внутренние классы всегда являются конкретными, никогда не абстрактными, и поэтому должны всегда реализовывать все требуемые методы.

Решением этой проблемы, без использования других классов, является реализация двух других методов.Поскольку у вас нет желаемой функциональности для них, вы, вероятно, можете оставить их пустыми и ничего не делать.Большинство IDE на самом деле должно помочь вам в этом, поскольку, когда вы начинаете создавать анонимный внутренний класс, они будут предлагать сгенерировать для вас нереализованные методы.

В качестве альтернативы, вы можете расширить другой класс, который может иметь некоторые или всеэти методы уже реализованы с помощью заглушек, таких как KeyAdapter, но в конечном итоге все методы должны быть реализованы тем или иным способом.

0 голосов
/ 16 октября 2018

Вместо этого используйте KeyAdapter.Он имеет встроенные заглушки.

bRef[i][j].addKeyListener(new KeyAdapter()...
...