Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не вызывается repaint() 
V
    Опции темы
danilsl
Дата 25.10.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 15.3.2006

Репутация: нет
Всего: нет



Всем доброго времени суток.
Вот код:
Код

    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 не отрабатывает! Он просто пропускается! В итоге у меня зависший мидлет. Объясните пожалуйста мне новичку почему это происходит
PM MAIL   Вверх
eugine_s
Дата 25.10.2008, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



Цитата(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) я бы советовал еще не привязывать модель и отрисовку (т.е. у тебя модель ничего не будет делать пока не будет произведена отрисовка). Точнее можно так делать, но таким образом как у тебя реализовано... так не покатит.
PM MAIL   Вверх
danilsl
Дата 26.10.2008, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 15.3.2006

Репутация: нет
Всего: нет



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

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0785 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.