Recibo dos errores al crear esta clase. El primero aparece en:

public class DisplayerDeluxe extends JPanel implements ActionListener, 
KeyListener{

Se muestra el siguiente error del compilador: DisplayerDeluxe is not abstract and does not override abstract method keyReleased(java.awt.event.KeyEvent) in java.awt.event.KeyListener

El siguiente error se muestra aquí.

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");
    }

El error dice: <anonymous DisplayerDeluxe$1> is not abstract and does not override abstract method keyReleased(java.awt.event.KeyEvent) in java.awt.event.KeyListener

Esto me confunde mucho porque en ninguna parte de mi código incluyo keyReleased () y keyPressed () tiene la notación @Override. ¡Cualquier información sobre esto será muy apreciada!

0
SnugglyCrow 16 oct. 2018 a las 14:02

2 respuestas

La mejor respuesta

Cuando declaras new KeyListener() { ... } estás creando lo que se conoce como una clase interna anónima que extiende KeyListener y crea una instancia sin nombre de ella (por lo tanto, anónima). El error es quejarse de que su clase interna anónima, mostrada como <anonymous DisplayerDeluxe$1>, no es abstracta ni implementa el método keyReleased(java.awt.event.KeyEvent) como se describe en java.awt.event.KeyListener.

KeyListener es una interfaz que contrae implementadores para proporcionar 3 métodos. Esto significa que todas las clases, incluidas las clases internas anónimas, que implementan esta interfaz deben ser abstractas (y por lo tanto no están obligadas a proporcionar una implementación) o clases concretas / normales con implementaciones proporcionadas. Las clases internas anónimas son siempre concretas, nunca abstractas y, por lo tanto, siempre deben implementar todos los métodos requeridos.

La solución a esto, sin usar otras clases, es implementar los otros dos métodos. Como no tiene ninguna funcionalidad deseada para ellos, probablemente pueda dejarlos vacíos y no hacer nada. La mayoría de los IDE deberían ayudarlo con esto, ya que, cuando comience a crear la clase interna anónima, le solicitarán que genere los métodos no implementados.

Alternativamente, puede extender otra clase que puede tener algunos o todos esos métodos ya implementados con stubs como KeyAdapter, pero en última instancia, todos los métodos deben implementarse de una forma u otra.

1
Danikov 16 oct. 2018 a las 15:26

En su lugar, utilice un KeyAdapter. Tiene talones incorporados.

bRef[i][j].addKeyListener(new KeyAdapter()...
1
BrentR 16 oct. 2018 a las 12:12