在Java中,AWT,repaint-method似乎被忽略,转而使用start-method

时间:2011-04-06 13:18:24

标签: java applet awt repaint

我正在构建一个棋盘游戏的小程序,处理用户输入大致如下:

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()?

当然,如果有必要,我可以提供更多代码。

2 个答案:

答案 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()功能在事件派发线程之外发生。