2012-04-20 29 views
0

十字キーを押すと、画像を16ずつ右に移動したいと考えています。ポイントに達するまで速度(1px/10ms)で移動したい。イメージはJPanelの子クラスに作成されます。 私は次のコードを書いたが、画像ではなく、動き作り頂くと位置を変更します。スイングで画像を移動

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をブロックしているため、再描画は直接実行されません(ただし、すべてのコードが終了した後、再描画イベントが発生する可能性があるため、再描画イベントが発生します)。 ?

+4

であれば私も知りません

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

を+1 [javax.swing.Timer'](ここではhttp:// stackoverf low.com/q/9849950/230513)は、この文脈では 'SwingWorker'に代わるものです。 – trashgod

2

あなたが別のスレッドでmoveRight()を呼び出す場合

この試してみてください。私がテストしていませんでしたし、これは良いaproach

関連する問題