我正在编写一个程序,当我点击时会移动一个矩形。我有一个函数move()
,它将一个矩形向下移动一个100倍的像素,并使用pause(20)
在每次移动之间等待20ms。当我在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);
}
}
}
从move()
或run()
拨打mouseClicked()
有什么区别?我该如何解决?
答案 0 :(得分: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方法来强制重绘它。它现在应该工作。