如何編碼當按鍵(特別是空格鍵)被按下時啓動的事件,在鍵被保持爲時繼續運行,並且僅在釋放鍵時停止?我試圖模擬在粗糙表面上移動的輪式物體。我試過使用原始的KeyListener方法,但問題是,當我持有空格鍵時,我模擬的對象反覆停止並開始。我聽說一個可能的解決方案是關鍵綁定,但即使閱讀了關於它的Java教程,我仍然不理解它們。Java中的鍵監聽器/鍵綁定
下面是用於模擬(由休眠每隔10毫秒的線程控制)paint方法:
public void paint(Graphics g)
{
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Shape roadsurface = new Rectangle2D.Float(0, 85, 1000, 200);
g2.setColor(Color.BLACK);
g2.setStroke(new BasicStroke(10));
g2.draw(roadsurface);
g2.setColor(new Color(102, 102, 153));
g2.fill(roadsurface);
Image carimage = Toolkit.getDefaultToolkit().getImage("cargrey.png");
g2.drawImage(carimage, x_pos, y_pos, 60, 30, this);
g2.finalize();
}
下面是用來改變X_POS(未聲明的變量假設已經在被宣佈的方法類主體):
public void accelerate()
{
do
{ acc = 15.0 - t;
vel = (t * 15.0) - (0.5 * Math.pow(t, 2.0));
disp = (0.5 * 15.0 * Math.pow(t, 2.0)) - ((1.0/6.0) * Math.pow(t, 3.0));
x_pos = (int)disp;
t += 0.01; break;} while (acc > 0);
while (acc <= 0)
{ acc = 0;
disp = t * vel;
x_pos = (int)disp;
t += 0.01;
}
}
public void brake(double vel, double disp)
{
double u = 0;
double disp2;
while (vel > 0)
{
disp2 = (vel * u) + (0.5 * -100 * Math.pow(u, 2.0));
vel = vel + (-100 * u);
x_pos = (int)(disp + disp2);
u += 0.01;
t += 0.01; break;}
while (vel <= 0)
{
u += 0.01;
t += 0.01;
}
}
這是我對事件的初步設想:
class Key1 extends Thread implements KeyListener
{
Track g;
boolean keyIsPressed;
Key1(Track g)
{
this.g = g;
}
public void keyTyped(KeyEvent ke) {}
public void keyPressed(KeyEvent ke)
{
if (ke.getKeyCode() == KeyEvent.VK_SPACE)
keyIsPressed = true;
}
public void keyReleased(KeyEvent ke)
{
if (ke.getKeyCode() == KeyEvent.VK_SPACE)
keyIsPressed = false;
}
public void run()
{
while (keyIsPressed)
{
g.repaint();
g.accelerate();
try
{
Thread.sleep(10);
}
catch (InterruptedException ex)
{
// swallowed
}
while (!keyIsPressed)
{
g.repaint();
g.brake(g.vel, g.disp);
try
{
Thread.sleep(10);
}
catch (InterruptedException ex)
{
// swallowed
}
}
}
可以有更多的方法來做到這一點。我過去處理這個問題的方式將是一個監控系統,因此我會在任何時候檢查密鑰是否關閉。當動畫/效果是時間的函數時,效果很好。 – 2013-02-28 20:36:40