2012-04-20 42 views
0

我想在按下箭頭鍵時將圖像在屏幕上向右移動16。我想以一個速度(1px/10ms)移動它直到達到該點。該圖像是在JPanel的子類中創建的。 我寫了下面的代碼,但圖像instatly改變位置而不是使運動:用Swing移動圖像

public class Test extends JFrame implements KeyListener { 
    private int x=0; 
    private int y=0; 
    BufferedImage img; 
    ... 
    ... 
    public void paint(Graphics g){ 
     g.drawImage(img,x,y,null); 
    } 
    // Move to a point 16 pixels to right 
    public void moveRight(){ 
     for(int i=0;i<16;i++){ 
      x++; 
      repaint(); 
      try { 
       Thread.sleep(10); // Sleep 10 milliseconds until next position change 
      }catch (InterruptedException e) {} 
     } 
    } 

    public void keyPressed(KeyEvent e) { 
     if(e.getKeyCode()==KeyEvent.VK_RIGHT){ 
      moveRight(); 
     } 
    } 
} 

回答

4

的問題是EDT(事件調度線程)內你的睡眠。 repaint()觸發一個事件,該事件將由EDT分派,並將依次執行組件的實際重新繪製。由於您阻止了EDT,重繪不會直接執行(但是在所有代碼結束之後,會發生一次重繪事件(因爲重繪事件會盡可能分組),您可能需要使用SwingWorker來解決此問題。

+4

+1一個'javax.swing.Timer',顯示在[here](http:// stackoverf low.com/q/9849950/230513)是此上下文中「SwingWorker」的替代方案。 – trashgod 2012-04-20 23:44:38

2

如果你在另一個線程調用MoveRight的()

試試這個:

public void keyPressed(KeyEvent e) { 
    if(e.getKeyCode()==KeyEvent.VK_RIGHT){ 
     new Thread(new Runnable(){ 
      public void run(){ 
       moveRight(); 
      } 
     }).start(); 
    } 
} 

我沒有測試,我甚至不知道這是一個很好的形式給出