代码:
@Override
public void mouseReleased(MouseEvent e) { //when the mouse is pressed
Point where=e.getPoint();
int x=(where.x-3)/20+1;
int y=(where.y-30)/20+1;
if(x>=1&&x<=30&&y>=1&&y<=30)
{
v[x][y]=1-v[x][y];
repaint();
try{
TimeUnit.MILLISECONDS.sleep(300);
}
catch(Exception ex){}
redo();
repaint();
}
}
绘制函数的设计目的是为了在屏幕上显示 V 矩阵的所有 30x30 元素。 redo函数对V做了一些改变(细节无关)。
我想做的是绘制 V 的元素,但 v[x][y] 发生变化,等待 0.3 秒,然后再次绘制 V 的元素,但这次是在它们被重做函数更改之后。但重画只在第二次有效,第一次什么也不做。
最佳答案
sleep 将阻塞事件驱动线程(EDT) - 尽量不要在应用程序的主线程中 sleep 。 EDT 将渲染您的框架/对话框/面板,并将响应单击、菜单和键盘输入。仅在此线程上执行快速任务非常重要。
添加一个 Timer 对象以便稍后运行代码怎么样?
Timer timer = new Timer(300, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// runs code on the EDT to edit UI elements (recommended way)
redo();
repaint();
}
});
}
});
timer.setRepeats(false);
timer.start();
因此Timer对象将创建一个新线程,延迟300毫秒,然后调用'actionPerformed'方法。这将发生在计时器的线程上。不建议从除 EDT 之外的任何线程更改 UI 元素,因此我们使用 invokeLater 方法,该方法会导致 swing 在 EDT 本身上运行可运行对象 - 因此回到原始线程。
关于Java:重绘()不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22968313/