gpt4 book ai didi

Java mouseClicked() Canvas 不更新

转载 作者:行者123 更新时间:2023-12-01 04:39:18 29 4
gpt4 key购买 nike

我正在编写一个程序,当我单击时,它将移动一个矩形。我有一个函数 move(),它可以将矩形向下移动 100 倍一个像素,并使用 pause(20) 在每次移动之间等待 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);
}
}
}

run() 调用 move() 或从 mouseClicked() 调用有什么区别?我该如何修复它?

最佳答案

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

关于Java mouseClicked() Canvas 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16858957/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com