Как заставить прямоугольник остановиться, когда вы отпустите клавишу, которая его перемещает?

Я создал JFrame с прямоугольником в центре, который перемещается, когда я нажимаю определенные клавиши. Это все красиво и модно, но прямоугольник продолжает двигаться, когда я отпускаю ключи. Фактически, если я нажимаю клавишу несколько раз, прямоугольник ускоряется. Вероятно, это (определенно), потому что я использую таймер, чтобы обойти эту надоедливую задержку ввода 0,5 секунды при удерживании клавиши.

Я думаю, что я должен положить что-то вkeyReleased() метод, но я в растерянности за то, что поставить туда. Какие-нибудь советы? Благодарю.

PS:пожалуйста не кричи на меня за то, что я не использую привязки клавиш. Я знаю: они лучше и все такое. Но сейчас я сосредоточусь на ключевых слушателях.

Программа:

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) {}
}

Ответы на вопрос(1)

Ваш ответ на вопрос