我正在构建棋盘游戏的小程序,处理用户输入的过程大致如下所示:
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();
}
}
在人工输入后,计算机选择一个 Action 并像此方法一样调用 repaint() 和 start()。
但是屏幕似乎只有在计算机移动后才会更新,所以在调用 start() 之后。这怎么会发生,因为 repaint() 在 start() 之前被调用了?
我怀疑这可能是因为 repaint() 启动了一个新线程(是吗?),但它为什么要等待 start()?
当然,如果需要,我可以提供更多代码。
最佳答案
repaint() 调用不会执行重绘 - 它会安排完成重绘。在任何当前和已经安排的事件完成后,事件线程稍后会执行实际的重绘(由于其他与此处无关的原因,它可能会发生得更晚)。 start() 方法在调度完成后立即被调用,作为响应当前事件的一部分。所以是的,实际绘制总是在调用 start() 之后进行。
参见 the description of repaint()和 the description of the paint mechanism了解更多详情。
通常像这样调用 start() 可能是不好的。调用 start() 时,UI 无法响应任何内容(例如调整游戏窗口大小或未覆盖),除非 start() 是一个非常短的操作,否则这将导致 UI 看起来没有响应。
关于java - 在 Java、AWT 中,repaint-method 似乎被忽略以支持 start-method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5566994/