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"
Throw out the getWhen() part, you don't need it. Just set the flag when
the key is pressed, and clear it when it's released.