Как заставить прямоугольник остановиться, когда вы отпустите клавишу, которая его перемещает?
Я создал 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) {}
}