I replaced the jar with a version that uses nanoTime instead of currentTimeMillis. So hopefully this will maintain a better frame and key checking rate. Was it running slowly on your machine.
I am just overiding the processKeyEvent() method to store the key press and then checking for the key in the game loop. So if you are missing events the only thing i can think of is that the game loop is running too slow. If it is still a problem I will look and decoupling the logic loop from the draw loop.
Not sure what the issue with the gray screen is, any exception. I also now get and dispose of the graphics context each frame so this may fix the gray screen issue. Refresh and let me know if it helps.
The double-movement appears to be fixed but it's still missing 70% of key presses.
Edit: why would the speed of the game loop matter? Mark the key as down in the event thread when you get a KEY_PRESSED event and mark it as up in the logic thread when you process it. You can still miss some keys presses, but speed is irrelevant because it's just a synchronisation issue. If you have the spare bytes, see my thread on key handling. No-one's made any comments on it yet, but at least that means that if it has any flaws they're not glaringly obvious.