Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java、AWT中,重绘方法似乎被忽略,取而代之的是start方法_Java_Applet_Awt_Repaint - Fatal编程技术网

在Java、AWT中,重绘方法似乎被忽略,取而代之的是start方法

在Java、AWT中,重绘方法似乎被忽略,取而代之的是start方法,java,applet,awt,repaint,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,whos

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

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()。
但屏幕似乎只有在计算机移动后才会更新,因此调用after start()。既然在start()之前调用了repaint(),这怎么会发生呢

我怀疑这可能是因为repaint()启动了一个新线程(是吗?),但它为什么要等待start()

当然,如果需要的话,我可以提供更多的代码。

repaint()调用不会执行重新绘制-它会安排要执行的重新绘制。在任何当前和已计划的事件完成后,事件线程将稍后执行实际的重新绘制(由于其他与此处不相关的原因,它可能会发生得更晚)。在调度完成后,作为响应当前事件的一部分,会立即调用start()方法。因此,是的,实际的绘制总是在调用start()之后进行

有关更多详细信息,请参阅和

一般来说,这样调用start()可能不好。调用start()时,UI无法响应任何内容(如调整游戏窗口大小或打开),除非start()是一个非常短的操作,否则这将导致UI看起来没有响应

repaint()调用不执行重新绘制-它计划执行重新绘制。在任何当前和已计划的事件完成后,事件线程将稍后执行实际的重新绘制(由于其他与此处不相关的原因,它可能会发生得更晚)。在调度完成后,作为响应当前事件的一部分,会立即调用start()方法。因此,是的,实际的绘制总是在调用start()之后进行

有关更多详细信息,请参阅和


一般来说,这样调用start()可能不好。调用start()时,UI无法响应任何内容(如调整游戏窗口大小或打开),除非start()是一个非常短的操作,否则这将导致UI看起来没有响应

@DJClayworth已经解释了为什么你的应用程序会这样运行,但是如果你使用的是
JComponent
,并且你绝对需要在自己的事件处理过程中重新绘制,你可以使用其中一种方法。但是,您可能应该先花一些时间来决定是否可以重构代码,使
start()
功能发生在事件调度线程之外。

@DJClayworth已经解释了为什么您的应用程序会这样运行,但是,如果您使用的是
JComponent
,并且在您自己的事件处理过程中绝对需要重新绘制,那么您可以使用以下方法之一。但是,您可能应该先花一些时间来决定是否可以重构代码,使
start()
功能发生在事件调度线程之外。

请您解释一下,为什么它应该在事件调度线程之外?一般来说,事件调度线程(EDT)不应忙于运行与UI无关的代码。在这种情况下,不清楚
start()
方法在做什么,因此只有@Maarten可以决定是否可以将其移出EDT。好的提示。将UI与游戏机制分开确实是个好主意。它们现在有些混乱。我想我应该在小程序初始化时创建一个新线程?你能解释一下,为什么它应该在外部吗?一般来说,事件调度线程(EDT)不应该忙于运行与UI无关的代码。在这种情况下,不清楚
start()
方法在做什么,因此只有@Maarten可以决定是否可以将其移出EDT。好的提示。将UI与游戏机制分开确实是个好主意。它们现在有些混乱。我想我应该在小程序初始化时创建一个新线程?