【问题标题】:improve my KeyBoard Input (KeyListener) Java改进我的键盘输入 (KeyListener) Java
【发布时间】:2019-01-03 15:06:51
【问题描述】:

问题在于空闲运行循环的 poll 方法。 另外,要添加 Windows 按钮,我必须将数组增加到 524。

keys = 新布尔值[524]; 轮询 = 新 int[524];

我想摆脱循环,但我还没有弄清楚如何。

如何去掉轮询循环来解决添加大数字按钮的问题?

class KeyBoardInput implements KeyListener
{
    private final boolean[] keys;
    private final int[] polled;

    KeyBoardInput()
    {
        keys = new boolean[256];
        polled = new int[256];
    }

    public boolean keyDownOnce(int keyCode)
    {
        return polled[keyCode] == 1;
    }

    public void poll()
    {
        for(int i = 0; i < keys.length; i++) // <-this
        {
            if(keys[i]) 
            {
                polled[i]++;
            } 
            else 
            {
                polled[i] = 0;
            }
        }
    }

    @Override
    public void keyTyped(KeyEvent e)
    {

    }

    @Override
    public void keyPressed(KeyEvent e)
    {
        int keyCode = e.getKeyCode();
        if( keyCode >= 0 && keyCode < keys.length ) 
        {
            keys[ keyCode ] = true;
        }
    }

    @Override
    public void keyReleased(KeyEvent e)
    {
        int keyCode = e.getKeyCode();
        if( keyCode >= 0 && keyCode < keys.length ) 
        {
            keys[ keyCode ] = false;
        }
    }

}

调用 KeyBoardInput 的类。

@Override
public void run()
{
    running = true;
    while(running)
    {
        gameLoop();
    }
}

private void gameLoop()
{
    processInput();
}

private void processInput()
{
    keyboard.poll();

    if(keyboard.keyDownOnce(KeyEvent.VK_SPACE)) 
    {
        System.out.println("VK_SPACE");
    }
    if(keyboard.keyDownOnce(KeyEvent.VK_C)) 
    {
        System.out.println("VK_C");
    }
    if(keyboard.keyDownOnce(KeyEvent.VK_ALT)) 
    {
        System.out.println("VK_ALT");
    }
}

【问题讨论】:

    标签: java swing events awt keylistener


    【解决方案1】:

    我解决了问题,事实证明这是可能的。

    @Override
        public synchronized void keyPressed(KeyEvent e)
        {
            if (e.getKeyCode() == KeyEvent.VK_SPACE)
            {
                System.out.println("VK_SPACE");
            }
            if (e.getKeyCode() == KeyEvent.VK_C)
            {
                System.out.println("VK_C");
            }
        }
    

    【讨论】:

    • 解决方案很简单。
    猜你喜欢
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2019-08-07
    • 2017-10-12
    • 2018-12-29
    • 2011-06-16
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多