如何在 Java 中处理同时按键?

Posted

技术标签:

【中文标题】如何在 Java 中处理同时按键?【英文标题】:How do I handle simultaneous key presses in Java? 【发布时间】:2010-10-19 16:11:43 【问题描述】:

如何在 Java 中处理同时按下的按键?

我正在尝试编写游戏,需要同时处理多个按键。

当我按住一个键(假设向前)然后按住另一个键(例如左转)时,会检测到新键,但不再检测到旧按键。

【问题讨论】:

更多细节,请!你想做什么? 不好的问题,你需要更多细节:为什么是环境?摇摆? AWT? “句柄”是什么意思? 【参考方案1】:

一种方法是跟踪自己当前关闭了哪些键。

当你得到一个 keyPressed 事件时,将新的键添加到列表中;当您收到 keyReleased 事件时,从列表中删除该键。

然后在您的游戏循环中,您可以根据键列表中的内容执行操作。

【讨论】:

这似乎并不那么骇人听闻。 (显然有一些与焦点有关的小问题 - 我想假设所有的焦点都集中在获得/失去焦点上。) @MichaelMyers 你如何解释重复的键,如果我按住一个键,它就像一个金字塔一样:a |一个,一个 |一个,一个,一个|一个,一个,一个,一个|一个,一个,一个|一个,一个 |一个 @JayAvon:我认为这值得提出一个新问题。 @MichaelMyers ***.com/questions/11851155/… 是新问题的链接。任何帮助都会令人难以置信。 我建议使用 BitSet 而不是键列表【参考方案2】:

一般来说,您所描述的可以使用bitmasks来实现。

【讨论】:

Janusz 是什么意思?这不仅仅是相关的。是的,它与 Java 无关,但这并不意味着它有帮助。【参考方案3】:

这是一个代码示例,说明如何在按下 CTRL+Z 时执行操作:

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
class p4 extends Frame implements KeyListener

    int i=17;
    int j=90;
    boolean s1=false;
    boolean s2=false;

    public p4()
    
        Frame f=new Frame("Pad");

        f.setSize(400,400);
        f.setLayout(null);
        Label l=new Label();
        l.setBounds(34,34,88,88);
        f.add(l);

        f.setVisible(true);
        f.addKeyListener(this);
    

    public static void main(String arg[])
        new p4();
    

    public void keyReleased(KeyEvent e) 
        //System.out.println("re"+e.getKeyChar());

        if(i==e.getKeyCode())
        
            s1=false;
        

        if(j==e.getKeyCode())
        
            s2=false;
        
    

    public void keyTyped(KeyEvent e) 
        //System.out.println("Ty");
    

    /** Handle the key pressed event from the text field. */
    public void keyPressed(KeyEvent e) 
        System.out.println("pre"+e.getKeyCode());

        if(i==e.getKeyCode())
        
            s1=true;
        

        if(j==e.getKeyCode())
        
            s2=true;
        

        if(s1==true && s2==true)
        
            System.out.println("EXIT NOW");
            System.exit(0);
        
    

    /** Handle the key released event from the text field. */


【讨论】:

但是如果其他键必须是非修饰键怎么办?比如说,用于在屏幕上移动精灵和拍摄空间的方向键?您希望能够在移动时进行拍摄

以上是关于如何在 Java 中处理同时按键?的主要内容,如果未能解决你的问题,请参考以下文章

如何同时检测按键和鼠标悬停

Unity3D 中如何同时获得鼠标点击和键盘按键

如何在Java中检测按键

如何在 Java 中按键对 Map 值进行排序?

如何在 Qt 应用程序中生成按键事件到系统(win7)(模拟用户在键盘上按键)?

如何捕获android系统按键事件