2

クリックすると長方形を移動するプログラムを書いています。move()長方形を1ピクセル下に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);
        }
    }
}

からの呼び出しとmove()からの呼び出しの違いは何ですか? どうすれば修正できますか?run()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 プログラムはそれを再描画する必要があることを認識しないことです (スレッドの問題を推測しています。誰か確認できますか?)。ペイント メソッドを呼び出して強制的に再描画する必要がありました。今すぐ動作するはずです。

于 2013-05-31T13:59:18.890 に答える