2

我正在编写一个程序,当我单击时会移动一个矩形。我有一个函数move()可以将矩形向下移动一个像素 100 倍,并在每次移动之间等待 20 毫秒,使用pause(20). 当我调用这个函数时,run()一切都按我的预期工作,并显示了一个动画。但是当我从 调用它时 mouseClicked(),动画没有显示,但我只能看到矩形的最后一个位置。

附上代码:

import acm.program.*;
import acm.graphics.*;
import java.awt.event.*;

public class Test extends GraphicsProgram{

    private GRect rect;

    public void run() {
        rect = new GRect(20,20);
        add(rect, 0, 0);
        move();

        addMouseListeners(); 
    }

    public void mouseClicked(MouseEvent e) {
        move();
    }

    void move()
    {
        for (int i=0; i<100; i++) {
            rect.move(0, 1); pause(20);
        }
    }
}

call move()fromrun()或 from 和有什么不一样mouseClicked()?我该如何解决?

4

1 回答 1

0

啊啊啊啊,痛苦的回忆。尝试

public void init(){
   add(rect, 0, 0);
   rect = new GRect(20,20);
   addMouseListeners();
 }

public void run() {

}

我也注意到了这种行为,我应该提一下,尽快离开 acm 是个好主意,它非常适合开始学习 java,但它是一个以非常特定的方式工作的工具,所以很脏就像一击是必要的。

这有效:

private GRect rect;

@Override
public void init() {
    rect = new GRect(20, 20);
    add(rect, 0, 0);
    addMouseListeners();
}

public void run() {
}

public void mouseClicked(MouseEvent e) {
    move();
}

void move() {
    for (int i = 0; i < 100; i++) {
        rect.move(0, 1);
        rect.paint(getGraphics());
        paint(getGraphics());
        pause(20);
    }
}

问题是,即使您移动矩形,acm 程序也不知道它必须重新绘制它(我猜是线程问题,有人可以确认吗?)当它在 mouseevent 内部调用并且重新绘制调用被忽略时,我们不得不通过调用它的paint方法来强制它重新绘制。它现在应该可以工作了。

于 2013-05-31T13:59:18.890 回答