我正在开发一款遵循 MVC 框架的贪吃蛇游戏。为此,我决定将 keyListener 放在程序的 Controller 部分。最初我把它放在 View 部分并且效果很好。但是,当我将 KeyListener 移至 Controller 时,它不起作用。我认为这与 View 扩展了 JFrame 但 Controller 没有扩展这一事实有关。我的具体问题是我不知道如何添加 addKeyListener(this)。我拥有 KeyListener 的目标是让我知道何时按下游戏中的箭头键。
这是 Controller
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();
}
}
这是 View
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);
// }
}
我真的很感谢任何帮助。如果有些事情不清楚或者我需要添加更多代码,我会很乐意这样做。
最佳答案
您无法在 Controller
类上调用 addKeyListener
,因为它没有 addKeyListener
方法。
您可以在 Controller
中实现 KeyListener
并将其添加到您的View
> 实例。只需在您的 View 上调用 addKeyListener
即可。
public Controller() {
model = new Model();
view = new View();
view.addKeyListener(this); // changed
System.out.println("Hello");
}
关于Java KeyListener 不起作用,我认为它与 addKeyListener() 有关;方法我不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52174761/