【问题标题】:Multiple Key events handling多键事件处理
【发布时间】:2014-08-25 22:27:24
【问题描述】:

我正在尝试用 Java 制作游戏(乒乓球)。此刻,我还在纠结于独立移动球拍。

总结游戏,我有 2 个对象由同一个键盘控制。 Racket_1 应该在按下“a”时上升,在按下“q”时下降,Racket_2 应该在“p”和“m”时做同样的事情。当我尝试随机移动球拍时,在我看来 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);
    }
}

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

【问题讨论】:

  • 如果你在这个网站上搜索过类似类型的问题,你会经常看到 Swing 专家建议不要使用 KeyListeners,而是使用 Key Bindings,我同意他们的理由有很多。我建议您这样做,搜索类似的问题,因为您可能会找到对您有帮助的答案。

标签: java multithreading swing keyevent


【解决方案1】:

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

KeyListener 只会在它注册到的组件是可聚焦的并且具有焦点时触发键事件。这是KeyListener 的一个众所周知的问题。

您应该尝试使用键绑定 API,有关详细信息,请参阅 How to Use Key Bindings

【讨论】:

  • 我一定会的。
【解决方案2】:

查看Motion Using the Keyboard 以获取示例。 KeyboardAnimation.java 示例将允许您在单独的组件上使用绑定。

【讨论】:

    【解决方案3】:

    很抱歉回复晚了,但我没有任何互联网连接。

    我已经尝试了评论者提供的所有链接,但他们没有帮助我。但是,我在 Threads 方面已经成功了一半,因为我知道如果两个任务可以同时执行,那么我的问题就迎刃而解了。所以我尝试创建两个玩家:第一个带有“a”和“p”的动作,第一个带有“p”和“m”的动作,我在面板中实现了 run 方法,我根据按下或释放的键来操作,我的问题就解决了。

    感谢大家对我的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-23
      • 2012-02-16
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多