# Probleme mit dem KeyReleased-event



## Alex L (3. Sep 2010)

Hallo Leute!
Ich habe ein Problem mit den Key-events in Java.
In meiner Klasse habe ich einen KeyListener implementiert und in den Methoden KeyPressed und KeyReleased festgelegt, dass die Events ausgeben sollen, welche Taste gedrückt bzw. losgelassen wurde.
Zusätzlich soll aber das KeyReleased-event nur EINMAL (!) ausgelöst werden.

Der Code:

```
import java.awt.event.*;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class IsTheKeyEventWorking extends JPanel implements KeyListener {
    boolean keyDown;

    public static void main(String[] args) {
        new IsTheKeyEventWorking(100, 200);
    }

    public IsTheKeyEventWorking(int w, int h) {
        this.setPreferredSize(new Dimension(w, h));
        JFrame frame = new JFrame("POKéMON");
        frame.setLocation(100, 100);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.addKeyListener(this);
        frame.add(this);
        frame.pack();
        frame.setVisible(true);
        frame.setResizable(false);
    }

    public void keyPressed(KeyEvent e) {
        if(!keyDown) {
            System.out.println("Key pressed!");
        }
        keyDown = true;
    }
    
    public void keyReleased(final KeyEvent e) {
        System.out.println("Key released!");
        keyDown = false;
    }
    
    public void keyTyped(KeyEvent e) {
    }
}
```

Ein System.out.println(…) ergibt folgendes:
»Key x pressed!
Key x released!
Key x pressed!
Key x released!
Key x pressed!
Key x released!
« … usw.

Da ich Linux benutzte (genauer Ubuntu 10.04) weiß ich, dass es am Bug #5011907 liegt.

Doch vielleicht hat ja einer von euch eine Idee, die mich retten könnte ;D

Vielen Dank schonmal im vorraus
und viele Grüße,
Alex


----------



## Gast2 (3. Sep 2010)

Wie ja geschrieben ist, ist es kein Bug  Linux und Solaris handeln das so... 
Hatte mich damit auch schon mal rumgeschlagen total nervig...

Du muss halt irgendwie die Keyevents vergleichen ob diese die gleiche sind...


----------



## SlaterB (3. Sep 2010)

messe die Zeit zwischen den Events, ignoriere keyReleased, wenn in den letzten x ms ein keyPressed geklickt wurde,

alternativ oder zur Kontrolle: wenn x ms lang statt nach einem keyReleased nix mehr kommt statt zig weiterer Events, 
dann war es wohl wirklich ein Release, also entsprechend verarbeiten,

ersteres erfordert nur Zeit nehmen in den Listener-Methoden, letzeres auch eine parallele aktive Bearbeitung


----------



## Alex L (3. Sep 2010)

Danke euch beiden, und: gute Idee SlaterB D
Ich habe gerade einen getimeten KeyListener implementiert (Beispiel[url]) und jetzt funktioniert alles blendend!


----------

