Java 键盘轮询有什么用?

Java 键盘轮询有什么用?,java,swing,events,awt,Java,Swing,Events,Awt,我正在使用Java 1.6制作一个2d图形应用程序。为了接收键盘输入,我只需在JPanel上使用addKeyListener(),在其中一个回调方法中按下(KeyEvent ke),我就可以进行绘图 `public void keyPressed(KeyEvent ke) { keyName=KeyEvent.getKeyText(ke.getKeyCode()); /*calling other classes ,calculating values

我正在使用Java 1.6制作一个2d图形应用程序。为了接收键盘输入,我只需在JPanel上使用
addKeyListener()
,在其中一个回调方法中按下
(KeyEvent ke)
,我就可以进行绘图

 `public void keyPressed(KeyEvent ke)
  {
        keyName=KeyEvent.getKeyText(ke.getKeyCode());
       /*calling other classes ,calculating values
        and drawing on the jpanel (moving an image ,etc)
        */
       ke.consume();
  }`
但我在一些博客中发现了另一种方法

1.)首先初始化一个
boolean[]键=新的boolean[256]

2.)然后,对于接收到的每个键事件,只需将值存储到此布尔数组中

`public void keyPressed(KeyEvent ke)
{
            //storing the keyevent:true since its due to key being pressed
    keyMap[ke.getKeyCode()]=true;
    ke.consume();
}`


`public void keyReleased(KeyEvent ke)
{
            //storing the keyevent:false since its due to key being released
    keyMap[ke.getKeyCode()]=false;
    ke.consume();
}`
最后还有一个方法,它通过布尔[]循环并检查键状态

        `for(int i=0;i<keyMap.length;i++)
        {
            if(keyMap[i]==true)
            {

                           /* do some graphic tasks...*/
            }
        }`

`for(int i=0;i第二种方法允许您同时按下多个键,通常允许双按键对角移动。

第二种方法允许您同时按下多个键,通常允许双按键对角移动。

尽管第二种方法生成的代码oks更像是在过去的好日子里轮询是如何完成的,它看起来并不完全像轮询。它仍然是一个修改数组的回调,而不是轮询…在Java中,对此你没有选择(至少不是100%Java代码)。如果你想使用本机,只要你的键盘连接到USB端口,你就可以真正轮询(如果它是PS/2,就我记忆所及而言,它是IRQ/回调)。虽然第二种方法生成的代码看起来更像过去的轮询方式,但它并不完全像轮询。它仍然是一个修改数组的回调,而不是轮询…在Java中,您对此没有选择(至少不是100%Java代码).如果您想使用本机,只要您的键盘连接到USB端口,您就可以进行轮询(如果是PS/2,就我记忆所及而言,它是IRQ/回调)。按键处理不会成为您程序中的瓶颈。除了I82,还有很多评论:除非您需要获得大约10^-9毫秒的速度,否则第一个按键可能会更快,因为它在按键一按下就开始工作。但我认为keyevent是从不同的线程调度的,可能无法很好地同步,因此第二个可能会被下注我想我相信Swing通常会从同一个线程发送所有事件。按键处理不会成为程序的瓶颈。除了I82,还有很多评论:除非您需要获得大约10^-9毫秒的速度,否则第一个可能会更快,因为它一按按键就开始工作。但我认为按键事件是从m不同的线程可能无法很好地同步,因此第二个线程可能会更好,我想我相信Swing通常会从同一个线程调度所有事件。