Java mouseClicked()画布不会更新

时间:2013-05-31 13:53:30

标签: java mouseclick-event

我正在编写一个程序,当我点击时会移动一个矩形。我有一个函数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()有什么区别?我该如何解决?

1 个答案:

答案 0 :(得分:0)

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

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方法来强制重绘它。它现在应该工作。