В Java, AWT, repaint-метод, кажется, игнорируется в пользу start-метода - PullRequest
1 голос
/ 06 апреля 2011

Я создаю апплет настольной игры, и обработка пользовательского ввода выглядит примерно так:

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 (), как этот метод.
Но экран, кажется, обновляется только после того, как компьютер сделал ход, поэтому после запуска вызывается (). Как это может произойти, так как repaint () вызывается перед start ()?

У меня есть подозрение, что это может быть из-за того, что repaint () запускает новый поток (не так ли?), Но зачем ждать start ()?

Я мог бы предоставить больше кода, если необходимо, конечно.

Ответы [ 2 ]

5 голосов
/ 06 апреля 2011

Вызов repaint () не выполняет перерисовку - он назначает перерисовку. Фактическая перерисовка выполняется позже потоком событий после завершения любых текущих и уже запланированных событий (это может произойти даже позже, чем по другим причинам, не имеющим здесь значения). Метод start () вызывается сразу после того, как планирование выполнено, как часть ответа на текущее событие. Так что да, фактическая краска всегда будет иметь место после вызова start ().

Подробнее см. описание repaint () и описание механизма рисования .

Вообще, вызов start (), как это, вероятно, плох. Пока вызывается start (), пользовательский интерфейс не может ни на что отвечать (например, изменение размера или раскрытия игрового окна), и если start () не является очень коротким действием, это приведет к тому, что пользовательский интерфейс будет не отвечать.

1 голос
/ 06 апреля 2011

@ DJClayworth уже объяснил, почему ваше приложение ведет себя так, как оно работает, но если вы работаете с JComponent и вам абсолютно необходимо перекрасить, чтобы это произошло во время вашей собственной обработки событий, вы можете использовать один из JComponent.paintImmediately() методы. Тем не менее, вам, вероятно, следует потратить некоторое время, прежде чем решить, можете ли вы реорганизовать свой код, чтобы функциональность start() происходила вне потока диспетчеризации событий.

...