我创建了一个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) {}
}
你的'keyReleased()'方法中没有任何东西。 – 2015-02-10 03:12:38
@ PM77-1我知道。我在我的问题中说过。我还说过,我不知道应该在我的'keyReleased()'方法中放置什么。 – AmiableNebula 2015-02-10 03:13:49
你的'keyReleased'方法需要停止计时器。另外,你的'keyPressed'方法如果它已经在运行,就不需要启动定时器。为了对定时器做些什么,你需要一个引用它 - 这应该可能存储在一个字段中。 – immibis 2015-02-10 03:15:17