Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Не вызывается repaint()


Автор: danilsl 25.10.2008, 20:21
Всем доброго времени суток.
Вот код:
Код

    public synchronized void keyPressed(int keyCode){
        if(!paused){
            if(keyCode==Left){
                if(checkMove(-1, 0))cfsx = -1;
                repaint();
                return;
            }
            if(keyCode==Right){
                if(checkMove(1, 0))cfsx = 1;
                repaint();
                return;
            }
            if(keyCode==Down){
                if(checkMove(0, 1))cfsy = 1;
                repaint();
                return;
            }
            if(keyCode==Rot){
                rotFig = true;
                repaint();
                return;
            }
            if(keyCode==Drop){
                while(checkMove(0, 1)){
                    cfsy = 1;
                    repaint();
                    serviceRepaints();
                }
                repaint();
            }
        }
    }

Результат работы checkMove полностью зависит от того отработает ли метод repaint(). Так вот, у меня чуть моск не закипел, пока я не обнаружил, что в цикле while repaint не отрабатывает! Он просто пропускается! В итоге у меня зависший мидлет. Объясните пожалуйста мне новичку почему это происходит

Автор: eugine_s 25.10.2008, 21:37
Цитата(danilsl @  25.10.2008,  20:21 Найти цитируемый пост)
while repaint не отрабатывает!


Все правильно

keyPressed вызывается системным потоком и всякие долгие операции в нем не должны выполняться.

Поэтому, чтобы я посоветовал:

1) в keyPressed только запоминать нажатую кнопку и все.

void keyPressed(int keyCode) {
keyPressed = keyCode;
}

и все.

А обрабатывать эту кнопку уже в другом потоке.

Может что-нибудь в вот таком стиле:

Код

public class MyCanvas extends Canvas implemens Runnable {


public void keyPressed(int keyCode) {
keyPressed = keyCode;
}

public run()  {

while (running) {

processKey(); // это метод обрабатывает нажатую кнопку.
callRepaint(); // этот отрисовывает.
}

}


}


2) repaint() - это только флаг "JVM, когда у тебя будет возможность перерисуй канвас". repaint - это не прямой вызов paint(Graphics g); Наверное ты это знаешь, так как используешь serviceRepaint();

3) я бы советовал еще не привязывать модель и отрисовку (т.е. у тебя модель ничего не будет делать пока не будет произведена отрисовка). Точнее можно так делать, но таким образом как у тебя реализовано... так не покатит.

Автор: danilsl 26.10.2008, 00:23
2,3)В общемто уже сам допёр. А serviceRepaints() после часа мучений нашёл в javadoc и воткнул. 
Вообще хотел сделать, чтобы отрисовывался не весь экран, а только изменяемая часть. А потом свернул мидлет на телефоне... В общем теперь пошёл стандартным путём. Только вот тормозит теперь заметнее. Короче модель из paint() убрал польностью, в итоге отпала необходимость в serviceRepaints(). Правда без него и работает пошустрей. Только местами прям явно видно, что фрейм-другой жилит.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)