Java KeyListener не работает, я думаю, это связано с addKeyListener(); метод, я не уверен, почему

Я работаю над змеиной игрой, которая следует структуре mvc. Для этого я решил, что keyListener будет находиться в разделе контроллера программы. Первоначально он у меня был в разделе просмотра, и он работал хорошо. однако, когда я переместил KeyListener на контроллер, это не сработало. Я думаю, что это как-то связано с тем, что представление расширяет JFrame, а контроллер - нет. моя конкретная проблема в том, что я не знаю, как добавить addKeyListener (это). Моя цель в том, чтобы иметь KeyListener, чтобы я знал, когда клавиши со стрелками нажаты для игры.

это контроллер

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

//import static com.sun.java.accessibility.util.AWTEventMonitor.addKeyListener;// this is what was suggested so that addKeyListener would work

public class Controller implements KeyListener {//this talks to the model and view
Model model;
View view;
public Controller(){
    model=new Model();
    view=new View();
    addKeyListener(this);
    System.out.println("Hello");

}
@Override
public void keyTyped(KeyEvent e) {
    System.out.println("Hey");
}

@Override
public void keyPressed(KeyEvent e) {
    System.out.println("Sup");

}

@Override
public void keyReleased(KeyEvent e) {
    System.out.println("WRUD");
}

public static void main(String[] args){
    System.out.println("Welcome to Snake");
    new Controller();
}

}

это вид

import javax.swing.*;
import java.awt.*;

public class View extends JFrame  {//this is what is viewed
        GameBoard gameBoard;//=new GameBoard();
    protected View() {
    super();
    setTitle("Snake");
    setSize(500,500);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    getContentPane().setLayout(new BorderLayout());
    gameBoard=new GameBoard();
    add(gameBoard);
    setVisible(true);
}

    // @Override
   // protected void paintComponent(Graphics g){
   //    super.paintComponent(g);
   //     g.setColor(Color.RED);
   //     g.drawRect(0,0,10,10);
   //     g.fillRect(0,0,10,10);
   // }


}

Я очень ценю любую помощь. Если что-то непонятно или мне нужно добавить больше кода, я с радостью это сделаю.


person Andrea Torres    schedule 04.09.2018    source источник
comment
Это компилируется? Вы пытаетесь вызвать addKeyListener в своем классе Controller, который, похоже, не имеет такого метода. Почему вы не хотите добавлять слушателя в свое представление?   -  person khelwood    schedule 05.09.2018
comment
он не компилируется, вы правы. Но если бы я написал то же самое, это сработало бы.   -  person Andrea Torres    schedule 05.09.2018
comment
Это потому, что ваш View расширяет JFrame, так что на самом деле у него есть метод addKeyListener. Вместо этого вы можете добавить своего ключевого прослушивателя в свое представление, просто изменив addKeyListener(this); на view.addKeyListener(this);.   -  person khelwood    schedule 05.09.2018
comment
я попробую это спасибо   -  person Andrea Torres    schedule 05.09.2018
comment
Не используйте KeyListener, это, как известно, проблематично — вместо этого используйте ключ API привязок   -  person MadProgrammer    schedule 05.09.2018


Ответы (1)


Вы не можете вызвать addKeyListener в своем классе Controller, потому что у него нет метода addKeyListener.

Вы можете внедрить KeyListener в свой Controller и добавить его в свой экземпляр View. Просто позвоните addKeyListener на ваш взгляд.

public Controller() {
    model = new Model();
    view = new View();
    view.addKeyListener(this); // changed
    System.out.println("Hello");
}
person khelwood    schedule 04.09.2018