我正在构建一个棋盘游戏的小程序,处理用户输入大致如下:
public void mousePressed(MouseEvent event) {
int row = event.getX() / (getSize().width / 8) ;
int column = event.getY() / (getSize().height / 8) ;
if(possibleMove(column, row) {
makeMove(column,row,whosTurn);
repaint();
start();
}
}
人工输入后,计算机选择一个移动并调用repaint()和start(),就像这个方法一样。
但是屏幕似乎只有在计算机移动后才会更新,所以在调用start()之后。怎么会发生这种情况,因为在start()之前调用了repaint()?
我怀疑这可能是因为repaint()启动了一个新线程(是吗?),但为什么它会等待start()?
当然,如果有必要,我可以提供更多代码。
答案 0 :(得分:5)
repaint()调用不执行重绘 - 它会安排重绘完成。在任何当前和已经安排的事件完成之后,事件线程稍后执行实际重绘(由于此处不相关的其他原因,它可能发生甚至更晚)。调度完成后立即调用start()方法,作为响应当前事件的一部分。所以是的,实际的绘画将始终在调用start()之后进行。
有关详细信息,请参阅the description of repaint()和the description of the paint mechanism。
一般来说,调用start()就好了。在调用start()时,UI无法响应任何内容(例如正在调整大小或未覆盖的游戏窗口),除非start()是一个非常短的操作,否则将导致UI看起来没有响应。
答案 1 :(得分:1)
@DJClayworth已经解释了为什么你的应用就像它一样,但是如果你正在使用JComponent
而你绝对需要在你自己的事件处理期间重新绘制,你可以使用{{{ 3}}方法。但是,您可能应该花些时间首先决定是否可以重构代码以使start()
功能在事件派发线程之外发生。