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

2 に答える 2

4

問題は、EDT (Event-Dispatching-Thread) 内での睡眠です。repaint()EDT によってディスパッチされるイベントをトリガーし、コンポーネントの実際の再描画を実行します。EDT をブロックしているため、再描画は直接実行されません (ただし、すべてのコードの終了後、単一の再描画イベントが発生します (再描画イベントは可能な限りグループ化されるため)。SwingWorkerこの問題を修正するには、おそらく を使用する必要があります。

于 2012-04-20T23:20:27.863 に答える
2

別のスレッドでmoveRight()を呼び出すとどうなりますか?

これを試して:

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

私はテストしていませんし、これが良いアプローチかどうかさえわかりません

于 2012-04-21T00:06:43.630 に答える