Re: Keyboard state (instead of keyboard events)
 
Philipp Gressly wrote:
Hello everybody
I am programming a "moon-lander" and want to check every 100 ms if a
certain key is pressed.
The keyboard events (key-pressed, key-released and key-typed) are
not helpful, because the operating System (linux im my case)
generates key-releases and key-presses at its own (depending on the
"key repeat speed").
Is there a command to satisfy the following interface easily?
public interface KeyState {
  boolean isKeyDown(char keyCode);
}
With all your help, I have implemented the code below.
It works in 99%, because the gnome "keyPressed.getWhen()" has mostly
the same value
as a previous "keyReleased.getWhen()" in case of the
"key-repeat-sequence".
Very rarely the below mentioned code reports "down: false", but it
should be "down: true".
It would be interesting to have some feedback about other operating
systems.
Thanks
import javax.swing.JFrame;
import java.awt.event.*;
/**
 * @author Philipp Gressly (phi@gressly.ch)
 *  after a code from Luther :
http://forums.sun.com/thread.jspa?threadID=698156
 */
public class IgnoreRepeats extends JFrame implements KeyListener,
Runnable {
    private long    oldWhen = 0L;
    public boolean down;
    /* starter */
    public static void main(String[] _)         {
        new IgnoreRepeats("Test Frame").top(); }
    public IgnoreRepeats(String name){
        super(name);    }
    private void top() {
        super.addKeyListener           (this)         ;
        super.setDefaultCloseOperation (EXIT_ON_CLOSE);
        setSize                        (300, 300)     ;
        setVisible                     (true)         ;
        new                      Thread(this). start(); }
    public void run() {
        while (true) {
            System.out.println("down: " + down);
            try {
                Thread.currentThread().sleep(40);
            } catch (InterruptedException e) { }
        }
    }
    public void keyReleased(final KeyEvent e) {
        if (oldWhen == e.getWhen()) return;
        down = false; }
    public void keyPressed(final KeyEvent e) {
        long now = e.getWhen();
        if (oldWhen == now) return;
        oldWhen  = now;
        down     = true;    }
    /* ignore */
    public void keyTyped(KeyEvent e) {}
} // end "IgnoreRepeats"