@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元素。重做功能对V进行了一些更改(细节无关紧要)。
我想要做的是绘制V的元素,但是当v [x] [y]改变时,等待0.3秒,然后再次绘制V的元素,但是这次它们被重做后更改功能。但重画只在第二次起作用,第一次没有做任何事情。
答案 0 :(得分:1)
睡眠将阻止事件驱动线程(EDT) - 尽量不要在应用程序的主线程中休眠。 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'方法。这将发生在Timer的线程上。不建议从除EDT之外的任何线程更改UI元素,因此我们使用invokeLater方法导致swing在EDT本身上运行runnable - 所以回到原始线程。