我創建了一個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