【问题标题】:How do you handle keyboard events in linux?你如何处理linux中的键盘事件?
【发布时间】:2014-05-20 18:37:04
【问题描述】:

我使用 ubuntu。 ubuntu 处理键盘输入的方式与 windows 不同。在ubuntu中,按键按下事件触发后,会立即触发按键释放事件,即使你没有释放按键。这些假键释放事件使我难以编写游戏,尤其是编写碰撞检测。无论我的代码多么完美,我都无法解决问题。

作为一个证明,如果你只是编写一个程序来输出一个键是按下还是释放,你会看到 ubuntu 中的输出会是这样的 - keyPressed > keyReleased > keyPressed > keyReleased 等等,即使你不要释放钥匙。而在 windows - key Pressed > key Pressed > key Pressed> 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();
    }
}

【问题讨论】:

  • 您使用的是哪种语言。你能显示一些代码吗?
  • 我使用java。但是我发布的问题是一个低级问题,不依赖于任何编程语言。
  • @adnankamili 好的,我已经发布了一些代码来演示我的问题
  • 我实际上使用 C++ 并且从未遇到过这个问题。看来你覆盖了错误的处理程序 keypress 通常相当于 keydown + keyup 你没有 keyup 和 keydown 事件。
  • @adnankamili 你用c ++说你没有遇到这个问题,怎么会?你用 ubuntu 吗?

标签: java linux ubuntu keylistener keyevent


【解决方案1】:

尝试在游戏循环中使用更新方法,如下所示:

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 上,所以我不确定它是否有效。但我希望。

【讨论】:

  • 好吧,这与我的问题完全无关。
猜你喜欢
  • 2020-06-01
  • 1970-01-01
  • 2011-04-17
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多