我正在为我的学校编写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"中,很管用

推荐答案

我可以在以下三点提出建议:

问题1:

不要为不同的事件向sysout写入相同的消息,这会让您感到困惑,因此,请 for each 方法写下其真实名称并添加参数:

  • System.out.println("KeyInput.keyTyped(e=" + e + ")");
  • System.out.println("KeyInput.keyPressed(e=" + e + ")");
  • System.out.println("KeyInput.keyReleased(e=" + e + ")");).

这样,您将看到在哪里触发了什么.

这一点很重要,因为某些键不会触发所有3个事件(按下、释放、键入).

问题2:

如果您不添加面板spielfeld,EVET实际上都将被触发.因为我看不出你的Spielfeld类是什么,我打赌它捕捉(‘消费’)这些事件.

快速解决办法:与其将键监听器添加到this(this.addKeyListener(keyInput);),不如将它们添加到spielfeld:spielfeld.addKeyListener(keyInput);,也许这会奏效.

(请在下次提供所有相关代码)

问题3:

实际上,有一堆小问题:你没有描述你的实际问题.这些事件根本不会被触发吗?您得到了什么输出消息?也许在某个地方存在与此问题相关的被吞噬的异常.包括一个包含所有相关类的可运行示例.通常,当你把问题简单化时,你会自己看到解决方案.

所以,我希望这已经有帮助了.无论如何,请更新您的问题,这样如果后代来到这里寻找同样的问题,他们会有更好的信息.

Java相关问答推荐

将具有多个未知字段的SON映射到Java POJO

为什么我的画布没有显示在PFA应用程序中?

当切换javaFX场景时,stage的大小正在Minimize

inteliJ中是否有一个功能可以自动在块注释中的/*后面添加一个空格?''

Java FX中的河内之塔游戏-在游戏完全解决之前什么都不会显示

通过Spring Security公开Spring Boot执行器端点

@Rollback @ Transmission在验收测试中不工作

扩展视图高度,并将其拖动到较低的视图上,而不是将其向下推?

如何在Java中为thunk创建映射器函数

如何使用Criteria Builder处理一对多关系中的空值?

为什么在下面的Java泛型方法中没有类型限制?

无法使用Java PreparedStatement在SQLite中的日期之间获取结果

使用MediaPlayer类在一段时间后停止播放音乐

JavaFX复杂项目体系 struct

如何在右击时 Select 新行?

如何判断元素计数并在流的中间抛出异常?

Maven创建带有特定类的Spring Boot jar和普通jar

如何转换Vector<;对象>;转换为int?

Java 8 中 ByteBuffer 和 BitSet 的奇怪行为

类型安全:从 JSONArray 到 ArrayList> 的未经判断的转换