Java-Gaming.org    
Featured games (81)
games approved by the League of Dukes
Games in Showcase (482)
Games in Android Showcase (110)
games submitted by our members
Games in WIP (548)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  issue with keyPressed and keyReleased  (Read 1263 times)
0 Members and 1 Guest are viewing this topic.
Offline Fred304

Junior Newbie





« Posted 2006-04-15 13:40:10 »

I have a class that implements the KeyListener interface. When I press a key down and release it after a couple of seconds, I would expect the keyPressed method to be invoked exactly once and the keyReleased method to be invoked exactly once.

But what happens is that both methods get invoked very often, although I do not release the key. Is there any way to prevent this and obtain the desired behaviour described above?
Offline ryanm

Senior Member


Projects: 1
Exp: 15 years


Used to be bleb


« Reply #1 - Posted 2006-04-15 13:44:34 »

IIRC, you can look at the time reported by InputEvent.getWhen(). The spurious pairs of KeyReleased and KeyPressed events will have the same event time, so you can safely ignore them.
Offline woogley
« Reply #2 - Posted 2006-04-15 14:04:12 »

keyReleased should only be fired once anyway. keyPressed can be called multiple times due to the repeat rate set for the OS. that's why if you hold a key down in a word processor, after a second or so it will repeat that key over and over. you could just keep an array of all keys states, and only treat keyPressed seriously when it changes the key state (i.e. changing it to the same state does nothing)
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline ryanm

Senior Member


Projects: 1
Exp: 15 years


Used to be bleb


« Reply #3 - Posted 2006-04-15 14:13:10 »

keyReleased should only be fired once anyway. keyPressed can be called multiple times due to the repeat rate set for the OS.

It's been a while since I've looked at this, but on linux this is not the case. You get a constant stream of keypressed/keyreleased pairs.
Offline woogley
« Reply #4 - Posted 2006-04-15 14:43:22 »

really? that's pretty messed up, I bet my games probably run wacky on linux systems! maybe the best way is to completely ignore keyReleased events, and only set a key state in your array to 'released' when you receive the keyTyped event?
Offline Fred304

Junior Newbie





« Reply #5 - Posted 2006-04-15 14:54:35 »

really? that's pretty messed up
Yes, it's really annoying  Cry

This is what I do now:

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  
78  
79  
80  
public class Game implements KeyListener
{
   private class Keyvent
   {
      public KeyEvent _event;

      public boolean _pressed;

      public Keyvent(KeyEvent event, boolean pressed)
      {
         _event = event;
         _pressed = pressed;
      }
   }

   private Queue<Keyvent> _keyvents;

   public Game()
   {
      _keyvents = new LinkedList<Keyvent>();
   }

   public void keyPressed(KeyEvent e)
   {
      _keyvents.add(new Keyvent(e, true));
   }

   public void keyReleased(KeyEvent e)
   {
      _keyvents.add(new Keyvent(e, false));
   }

   public void update()
   {
      if (!_keyvents.isEmpty())
      {
         Iterator<Keyvent> it = _keyvents.iterator();
         Keyvent a = it.next();
         while (it.hasNext())
         {
            Keyvent b = it.next();
            if (a._event.getKeyCode() == b._event.getKeyCode()
                  && !a._pressed && b._pressed
                  && a._event.getWhen() == b._event.getWhen())
            {
               if (it.hasNext())
               {
                  a = it.next();
               }
               else
               {
                  a = null;
               }
            }
            else
            {
               processKeyvent(a);
               a = b;
            }
         }
         if (a != null)
         {
            processKeyvent(a);
         }
         _keyvents.clear();
      }
   }

   private void processKeyvent(Keyvent keyvent)
   {
      if (keyvent._pressed)
      {
         // do something with pressed key
     }
      else
      {
         // do something with released key
     }
   }
}


The problem is that update() does not run in the same thread as keyPressed and keyReleased. Sometimes update() gets invoked after the "fake" keyReleased has been put into the Queue, but the corresponding "fake" keyPressed has not yet been, and so the fake pair is not recognised as such.

Is there really no simple way such as a method like disableKeyRepeat() or something? Cry
Pages: [1]
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

 

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

atombrot (27 views)
2014-08-19 09:29:53

Tekkerue (25 views)
2014-08-16 06:45:27

Tekkerue (23 views)
2014-08-16 06:22:17

Tekkerue (15 views)
2014-08-16 06:20:21

Tekkerue (22 views)
2014-08-16 06:12:11

Rayexar (61 views)
2014-08-11 02:49:23

BurntPizza (39 views)
2014-08-09 21:09:32

BurntPizza (31 views)
2014-08-08 02:01:56

Norakomi (37 views)
2014-08-06 19:49:38

BurntPizza (67 views)
2014-08-03 02:57:17
List of Learning Resources
by Longor1996
2014-08-16 10:40:00

List of Learning Resources
by SilverTiger
2014-08-05 19:33:27

Resources for WIP games
by CogWheelz
2014-08-01 16:20:17

Resources for WIP games
by CogWheelz
2014-08-01 16:19:50

List of Learning Resources
by SilverTiger
2014-07-31 16:29:50

List of Learning Resources
by SilverTiger
2014-07-31 16:26:06

List of Learning Resources
by SilverTiger
2014-07-31 11:54:12

HotSpot Options
by dleskov
2014-07-08 01:59:08
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!