我正在为我的学校编写Snake程序,除了key Listener之外,一切都运行得很好.我真的不知道问题出在哪里,因为我认为我打电话的方式是正确的.
下面是我的窗口类的代码:
package GUI;
import Entity.Apple;
import Entity.Schlange;
import Threads.Threads;
import Threads.KeyInput;
import javax.swing.*;
public class Window extends JFrame {
public Window() {
Spielfeld spielfeld = new Spielfeld();
Apple apple = new Apple(0, 0, spielfeld);
KeyInput keyInput = new KeyInput(); // This is the keyListener
Schlange schlange = new Schlange(spielfeld, apple, keyInput);
Threads thread = new Threads(spielfeld, apple, schlange);
this.setTitle("Snake");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setResizable(false);
this.add(spielfeld);
this.pack();
this.addKeyListener(keyInput);
this.setVisible(true);
thread.startThread();
}
}
以及来自key Listener的:
package Threads;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
public class KeyInput implements KeyListener {
public Queue<String> queue = new ConcurrentLinkedQueue<>();
@Override
public void keyTyped(KeyEvent e) {
String moved = new String();
System.out.println("keyTyped");
if (e.getKeyCode() == KeyEvent.VK_W) {
System.out.println("W gedrückt");
moved = "up";
} else if (e.getKeyCode() == KeyEvent.VK_A) {
System.out.println("W gedrückt");
moved = "left";
} else if (e.getKeyCode() == KeyEvent.VK_S) {
System.out.println("W gedrückt");
moved = "down";
} else if (e.getKeyCode() == KeyEvent.VK_D) {
System.out.println("W gedrückt");
moved = "right";
}
queue.add(moved);
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("keyTyped");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("keyTyped");
}
}
Key Listener应该被添加到窗口中,然后被赋予"Schlange"(Germ.:Snake),在那里它将被处理.
我有很多System.out.println()代码行要调试,但它们都没有给出任何结果,我点击什么都无关紧要.
我是否应该将其添加到JPanel中?
编辑:我试着把它添加到JPanel"Spielfeld"中,很管用