你如何在linux中处理键盘事件?

时间:2014-05-20 18:37:05

标签: java linux ubuntu keylistener keyevent

我使用ubuntu。 ubuntu处理键盘输入的方式与windows的方式不同。在ubuntu中,触发按键事件后,即使您没有释放密钥,也会在此之后立即触发密钥释放事件。这些假密钥发布的事件让我很难对游戏进行编程,特别是对碰撞检测进行编程。无论我的代码多么完美,我都无法解决问题。

作为一个证明,如果你只是编写一个程序来输出是否按下了一个键,你会发现ubuntu中的输出会显示如下:keyPressed> keyReleased> keyPressed> keyReleased等等,即使你没有释放密钥。而在windows - key Pressed>按键>按键>按键等等。

你知道有什么方法可以解决这个问题吗?

如果你在ubuntu上运行它,这是一个简单的代码,可以解决我的问题: -

import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Strange extends JPanel implements KeyListener{

    public Strange(){
        this.setPreferredSize(new Dimension(500, 500));

        addKeyListener(this);
        setFocusable(true);

        JFrame frame=new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(this);
        frame.pack();
        frame.setVisible(true);
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_LEFT)
            System.out.println("left is pressed");
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_LEFT)
            System.out.println("left is released");
    }

    @Override
    public void keyTyped(KeyEvent e) {}

    public static void main(String[] args){
        new Strange();
    }
}

1 个答案:

答案 0 :(得分:0)

尝试使用带有这样的游戏循环的更新方法:

public class Strange extends JPanel implements KeyListener{

public Strange(){
    this.setPreferredSize(new Dimension(500, 500));

    JFrame frame=new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(this);
    frame.pack();
    frame.setVisible(true);

    while(true){
       update();

       try{
           Thread.sleep(10);
       }catch(Exception e){}
    }
}

public void update(){
    addKeyListener(this);
    setFocusable(true);
}

@Override
public void keyPressed(KeyEvent e) {
    if(e.getKeyCode()==KeyEvent.VK_LEFT)
        System.out.println("left is pressed");
}

@Override
public void keyReleased(KeyEvent e) {
    if(e.getKeyCode()==KeyEvent.VK_LEFT)
        System.out.println("left is released");
}

@Override
public void keyTyped(KeyEvent e) {}

public static void main(String[] args){
    new Strange();
}
}

我不在ubuntu上,所以我不确定它是否有效。但我希望。