Wie wird ein Rechteck angehalten, wenn Sie eine Taste loslassen, die es bewegt?

Ich habe einen JFrame mit einem Rechteck in der Mitte erstellt, das sich bewegt, wenn ich bestimmte Tasten drücke. Es ist alles schön und gut, aber das Rechteck bleibt bestehen, wenn ich die Tasten loslasse. Tatsächlich beschleunigt sich das Rechteck, wenn ich mehrmals eine Taste drücke. Dies liegt wahrscheinlich (definitiv) daran, dass ich einen Timer verwende, um diese lästige Eingangsverzögerung von 0,5 Sekunden zu umgehen, wenn ich eine Taste gedrückt halte.

Ich denke, ich muss etwas in das @ setzkeyReleased() Methode, aber ich bin ratlos, was dort zu setzen. Irgendwelche Tipps? Vielen Dank

PS:Bitt schreie mich nicht an, weil ich keine Tastenkombinationen benutze. Ich weiß: Sie sind besser und so. Aber ich konzentriere mich im Moment auf wichtige Zuhörer.

Programm

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage