¿Cómo hacer que un rectángulo se detenga cuando sueltas una tecla que lo mueve?

He creado un JFrame con un rectángulo en el centro que se mueve cuando presiono ciertas teclas. Todo es agradable y elegante, pero el rectángulo continúa cuando suelto las teclas. De hecho, si presiono una tecla varias veces, el rectángulo se acelera. Esto es probablemente (definitivamente) porque estoy usando un temporizador para evitar ese molesto retraso de entrada de 0.5 segundos al mantener presionada una tecla.

Creo que tengo que poner algo en elkeyReleased() método, pero no sé qué poner allí. ¿Algun consejo? Gracias.

PD:Por favor no me grites por no usar las combinaciones de teclas. Lo sé: son mejores y esas cosas. Pero me estoy centrando en los oyentes clave en este momento.

Programa:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.Timer;

@SuppressWarnings ("serial")
public class GameFrame extends JComponent implements KeyListener
{
    static GameFrame gameFrame = new GameFrame();

    public int x = 350;
    public int y = 250;
    public int keyCode;

    public static void main (String[] args)
    {
        JFrame frame = new JFrame ("Java Game");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.setSize (800, 600);
        frame.setResizable (false);
        frame.getContentPane().setBackground (Color.WHITE);
        frame.getContentPane().add (gameFrame);
        frame.addKeyListener (gameFrame);
        frame.setVisible (true);
    }

    @Override
    public void paintComponent (Graphics graphics)
    {
        super.paintComponent (graphics);
        graphics.setColor (Color.BLACK);
        graphics.fillRect (x, y, 100, 100);
    }

    public void keyPressed (KeyEvent event)
    {
        keyCode = event.getKeyCode();

        new Timer (100, new ActionListener()
        {
            public void actionPerformed (ActionEvent event)
            {
                if (keyCode == KeyEvent.VK_LEFT)
                {
                    x--;
                    repaint();
                }
                if (keyCode == KeyEvent.VK_RIGHT)
                {
                    x++;
                    repaint();
                }
                if (keyCode == KeyEvent.VK_UP)
                {
                    y--;
                    repaint();
                }
                if (keyCode == KeyEvent.VK_DOWN)
                {
                    y++;
                    repaint();
                }
            }
        }).start();
    }

    public void keyReleased (KeyEvent event) {}
    public void keyTyped (KeyEvent event) {}
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta