2013-05-31 60 views
1

我正在編寫一個程序,當我單擊時將移動一個矩形。我有一個功能move(),它將一個矩形向下移動100倍,並使用pause(20)在每次移動之間等待20ms。當我在run()中調用這個函數時,一切都按我的預期工作,並顯示一個動畫。但是當我從mouseClicked()中調用它時,動畫並未顯示,但我只能看到矩形的最後一個位置。爪哇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); 
     } 
    } 
} 

是什麼叫從run()mouseClicked()move()之間的區別?我該如何解決它?

回答

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中被調用,並且repaint調用被忽略,所以我們不得不通過調用它的paint方法來強制它重繪。它現在應該工作。

+0

感謝您的評論。我測試了它,但結果是一樣的。 – Sayaka

+0

請參閱編輯 – arynaq