|
Программирование Вопросы связанные с программированием в JAVA |
26.02.2009, 18:57
|
#1
|
AnyKey`щик
Регистрация: 30.11.2008
Сообщений: 18
Написано одно полезное сообщение
|
Canvas
Кто может объяснить, какая связь между методами KeyPressed(int) и paint(Graphics) класса Canvas?
У меня вот какая проблема: При событии нажатия на клавишу, в методе KeyPressed(int), я вызываю перересовку одной части экрана, и сразу же перерисовку другой части экрана. На практике выходит, что перерисовывается только вторая часть. Долго ломал голову, пока не прошел программу отладчиком. Выходит вот какая странная штуковина, если в методе KeyPressed(int) вызвать пару раз метод repaint(); То на самом деле метод paint(Graphics) вызывается только один раз, по завершению метода KeyPressed(int). Поэтому у меня на экране и отрисовывались только последние изменения. Так что же происходит внутри этого Canvasa, почему paint вызывается только после выхода из KeyPressed и как можно/можно ли это исправить?
|
(Offline)
|
|
27.02.2009, 00:36
|
#2
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Canvas
Просто оба метода являются системными и происходят чаще всего в одной нити. А repaint всего лишь сообщает системе о необходимости вызова paint, а она сама решает когда ей это сделать.
|
(Offline)
|
|
01.03.2009, 20:14
|
#3
|
AnyKey`щик
Регистрация: 30.11.2008
Сообщений: 18
Написано одно полезное сообщение
|
Ответ: Canvas
Решил, что выходом будет в методе KeyPressed(int) вызвать метод из другого потока и освободить системный поток для своевременной отрисовки. Как правильно приостановить(с возможностью последующего возобновления), как восстановить приостановленный процесс и как его полность остановить? Когда я себе это только планировал, начитавшись разной литературы, мне это казалось проще. В одной книжке прочитал про существование методов suspend() and resume(), но компилятор уверяет меня в их отсутствии. Короче у меня пока не выходит создать работающую модель. Покажите, как можно приостановить поток и продолжить его опять. И что происходит, когда метод run() заканчивается?
|
(Offline)
|
|
02.03.2009, 10:57
|
#4
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Canvas
keyPressed приостанавливать нельзя! Это системный процесс, некому будет отрисовывать.
Зачем нужно ДВА раза отрисовывать экран на одно нажатие клавиши? Обычно хватает одного repaint в самом конце keyPressed. А еще лучше просто сохранить нажатую клавишу в переменную, а в отдельной нити просто ждать изменения этой переменной и там уже отрисовывать хоть сто раз.
По поводу приостановки потока, почитай про wait и notify.
Когда завершается run, заканчивается выполнение нити.
|
(Offline)
|
|
02.03.2009, 21:07
|
#5
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: Canvas
Pilgrim, скажи пожалуйста, можно ли вызывать метод Thread.sleep внутри keyPressed? Просто у нас тут вышел спор с товарищем, он утверждает, что это делать категорически нельзя. И если действительно нельзя, как тогда делать задержку?
|
(Offline)
|
|
03.03.2009, 00:15
|
#6
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Canvas
делать этого категорически нельзя, повиснет системная нить и программа может сколько угодна втемную беситься, ни отрисовки, ни реакции на нажатия не будет.
такие методы как keyPressed называются callBack т.е. извещение программы о внешних событиях и должны завершаться как можно быстрее.
PS: Вы мне внятно объясните зачем вам задержка? Я уже не раз объяснял, ява это не МР, другие принципы взаимодействия.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
03.03.2009, 07:51
|
#7
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Canvas
Romanzes, понял? А я тебе что говорил?
pilgrim, Да нам нужно было сделать плавную прокрутку стрницы с текстом. Он мне доказывал, что можно сделать задержку в кейПрессед, ну я по-началу так и сделал, мидлет при такой прокрутке повисал. До меня дошло, что так делать нельзя, и я сделал в отдельном потоке прокрутку текста. При каждом нажатии инициализируется новый поток и текст плавно крутится до тех пор, пока кнопку не отпустят. Сначала я сомневался, правильно ли делаю на этот раз, так как думал, что каждый раз при нажатии создавать новый поток, - это повлияет как-то негативно на работу приложения, но практика показала, что всё отлично работает. Единственное, что обязательно нужно делать - проверять при нажатии инициализирован ли поток и создавать его только в случае, если он не инициализирован
|
(Offline)
|
|
03.03.2009, 12:31
|
#8
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Canvas
Как вариант, можно эту самую нить не создавать каждый раз, а просто усыпить ее с помощью wait когда нужно остановить прокрутку. А потом просто разбудить с помощью notify.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
03.03.2009, 12:47
|
#9
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Canvas
pilgrim, в следующий раз так и сделаю =)
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:24.
|