Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для мобильных телефонов > JAVA Micro Edition > Программирование

Программирование Вопросы связанные с программированием в JAVA

Ответ
 
Опции темы
Старый 26.02.2009, 15:57   #1
Serg_Bloim
AnyKey`щик
 
Регистрация: 29.11.2008
Сообщений: 18
Написано одно полезное сообщение
Canvas

Кто может объяснить, какая связь между методами KeyPressed(int) и paint(Graphics) класса Canvas?
У меня вот какая проблема: При событии нажатия на клавишу, в методе KeyPressed(int), я вызываю перересовку одной части экрана, и сразу же перерисовку другой части экрана. На практике выходит, что перерисовывается только вторая часть. Долго ломал голову, пока не прошел программу отладчиком. Выходит вот какая странная штуковина, если в методе KeyPressed(int) вызвать пару раз метод repaint(); То на самом деле метод paint(Graphics) вызывается только один раз, по завершению метода KeyPressed(int). Поэтому у меня на экране и отрисовывались только последние изменения. Так что же происходит внутри этого Canvasa, почему paint вызывается только после выхода из KeyPressed и как можно/можно ли это исправить?
(Offline)
 
Ответить с цитированием
Старый 26.02.2009, 21:36   #2
Piligrim
Оптимист
 
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений
(для 259 пользователей)
Ответ: Canvas

Просто оба метода являются системными и происходят чаще всего в одной нити. А repaint всего лишь сообщает системе о необходимости вызова paint, а она сама решает когда ей это сделать.
(Offline)
 
Ответить с цитированием
Старый 01.03.2009, 17:14   #3
Serg_Bloim
AnyKey`щик
 
Регистрация: 29.11.2008
Сообщений: 18
Написано одно полезное сообщение
Ответ: Canvas

Решил, что выходом будет в методе KeyPressed(int) вызвать метод из другого потока и освободить системный поток для своевременной отрисовки. Как правильно приостановить(с возможностью последующего возобновления), как восстановить приостановленный процесс и как его полность остановить? Когда я себе это только планировал, начитавшись разной литературы, мне это казалось проще. В одной книжке прочитал про существование методов suspend() and resume(), но компилятор уверяет меня в их отсутствии. Короче у меня пока не выходит создать работающую модель. Покажите, как можно приостановить поток и продолжить его опять. И что происходит, когда метод run() заканчивается?
(Offline)
 
Ответить с цитированием
Старый 02.03.2009, 07:57   #4
Piligrim
Оптимист
 
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений
(для 259 пользователей)
Ответ: Canvas

keyPressed приостанавливать нельзя! Это системный процесс, некому будет отрисовывать.
Зачем нужно ДВА раза отрисовывать экран на одно нажатие клавиши? Обычно хватает одного repaint в самом конце keyPressed. А еще лучше просто сохранить нажатую клавишу в переменную, а в отдельной нити просто ждать изменения этой переменной и там уже отрисовывать хоть сто раз.
По поводу приостановки потока, почитай про wait и notify.
Когда завершается run, заканчивается выполнение нити.
(Offline)
 
Ответить с цитированием
Старый 02.03.2009, 18:07   #5
Romanzes
Разработчик
 
Аватар для Romanzes
 
Регистрация: 05.04.2008
Сообщений: 541
Написано 196 полезных сообщений
(для 637 пользователей)
Ответ: Canvas

Pilgrim, скажи пожалуйста, можно ли вызывать метод Thread.sleep внутри keyPressed? Просто у нас тут вышел спор с товарищем, он утверждает, что это делать категорически нельзя. И если действительно нельзя, как тогда делать задержку?
(Offline)
 
Ответить с цитированием
Старый 02.03.2009, 21:15   #6
Piligrim
Оптимист
 
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений
(для 259 пользователей)
Ответ: Canvas

делать этого категорически нельзя, повиснет системная нить и программа может сколько угодна втемную беситься, ни отрисовки, ни реакции на нажатия не будет.
такие методы как keyPressed называются callBack т.е. извещение программы о внешних событиях и должны завершаться как можно быстрее.
PS: Вы мне внятно объясните зачем вам задержка? Я уже не раз объяснял, ява это не МР, другие принципы взаимодействия.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Phantom (03.03.2009)
Старый 03.03.2009, 04:51   #7
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,144
Написано 705 полезных сообщений
(для 1,741 пользователей)
Ответ: Canvas

Romanzes, понял? А я тебе что говорил?
pilgrim, Да нам нужно было сделать плавную прокрутку стрницы с текстом. Он мне доказывал, что можно сделать задержку в кейПрессед, ну я по-началу так и сделал, мидлет при такой прокрутке повисал. До меня дошло, что так делать нельзя, и я сделал в отдельном потоке прокрутку текста. При каждом нажатии инициализируется новый поток и текст плавно крутится до тех пор, пока кнопку не отпустят. Сначала я сомневался, правильно ли делаю на этот раз, так как думал, что каждый раз при нажатии создавать новый поток, - это повлияет как-то негативно на работу приложения, но практика показала, что всё отлично работает. Единственное, что обязательно нужно делать - проверять при нажатии инициализирован ли поток и создавать его только в случае, если он не инициализирован
(Offline)
 
Ответить с цитированием
Старый 03.03.2009, 09:31   #8
Piligrim
Оптимист
 
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений
(для 259 пользователей)
Ответ: Canvas

Как вариант, можно эту самую нить не создавать каждый раз, а просто усыпить ее с помощью wait когда нужно остановить прокрутку. А потом просто разбудить с помощью notify.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Phantom (03.03.2009)
Старый 03.03.2009, 09:47   #9
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,144
Написано 705 полезных сообщений
(для 1,741 пользователей)
Ответ: Canvas

pilgrim, в следующий раз так и сделаю =)
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
canvas: аналог GetPixel или как ? Tronix Основной форум 23 08.01.2012 09:04
Lib_videocnv: воспроизведение видео в режиме Canvas! ViNT Библиотеки 53 19.05.2011 05:22
Screen.Canvas beloff Delphi 3 05.04.2008 08:04
Soft в canvas andresyuk_be Основной форум 3 03.08.2007 20:53
Canvas & TextBox stinger25 Основной форум 3 06.02.2006 09:28


Часовой пояс GMT +1, время: 08:22.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com