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(事件调度线程)中的睡眠。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 回答