java - 多按键事件处理

标签 java multithreading swing keyevent

我正在尝试用 Java 制作一款游戏(乒乓球)。此时此刻,我仍然停留在独立移动 Racket 上。

总结一下游戏,我有 2 个由同一个键盘控制的对象。按下“a”时,Racket_1 应上升,按下“q”时下降,Racket_2 应按“p”和“m”执行相同操作。当我尝试随机移动 Racket 时,在我看来 keyPressed 和 keyReleased 在某些情况下不会被触发(按下和释放按键的某种顺序)。

这是我的示例代码(我通过打印按下的键来模拟运动):

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

import javax.swing.JFrame;
import javax.swing.JPanel;

public class PingPong extends JFrame implements KeyListener {

    private JPanel mainPanel = new JPanel();
    private boolean isAPressed;
    private boolean isQPressed;
    private boolean isPPressed;
    private boolean isMPressed;

    public PingPong() {
        this.setSize(400, 100);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setContentPane(mainPanel);
        this.setFocusable(true);
        this.addKeyListener(this);
    }

    @Override
    public void keyPressed(KeyEvent e) {
        char key = e.getKeyChar();
        switch (key) {
            case 'a':
                isAPressed = true;
                break;
            case 'q':
                isQPressed = true;
                break;
            case 'p':
                isPPressed = true;
                break;
            case 'm':
                isMPressed = true;
                break;
        }
        System.out.println("a is " + isAPressed + ", q is " + isQPressed
        + ", p is " + isPPressed + ", m is " + isMPressed);
    }

    @Override
    public void keyReleased(KeyEvent e) {
        char key = e.getKeyChar();
        switch (key) {
            case 'a':
                isAPressed = false;
                break;
            case 'q':
                isQPressed = false;
                break;
            case 'p':
                isPPressed = false;
                break;
            case 'm':
                isMPressed = false;
                break;
        }
        System.out.println("a is " + isAPressed + ", q is " + isQPressed
        + ", p is " + isPPressed + ", m is " + isMPressed);
    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
    }

    public static void main(String[] args) {
        new PingPong().setVisible(true);
    }
}

如果需要多线程,请尽量简单,因为我是新手。

最佳答案

最可能的原因是您违反了 KeyListener 的焦点要求。

KeyListener 仅当其注册的组件可聚焦且具有焦点时才会触发按键事件。这是 KeyListener 的一个众所周知的问题。

您应该尝试使用按键绑定(bind) API,请参阅 How to Use Key Bindings了解更多详情。

关于java - 多按键事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25495297/

相关文章:

multithreading - 多线程模型之间的差异

java - 如何强制设置 Java (.jar) 应用程序窗口的大小?

java - 将 JLabel 添加到 JPanel,将 JPanel 添加到 JFrame

java - 简单的 Java/Swing GUI 游戏

java - 使用数组列表和列表进行编号

java - 处理脏区时发生内部错误

python : efficiency concerns in parallel async calls to fetch data from web services

Java 只读了一半的 web url

java - TestNG - 2 个类之间的依赖关系(dependsOnGroups)

java - 我可以加入 ThreadPoolExecutor 创建的线程吗