forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Программирование (http://forum.boolean.name/forumdisplay.php?f=54)
-   -   Canvas (http://forum.boolean.name/showthread.php?t=7892)

Serg_Bloim 26.02.2009 18:57

Canvas
 
Кто может объяснить, какая связь между методами KeyPressed(int) и paint(Graphics) класса Canvas?
У меня вот какая проблема: При событии нажатия на клавишу, в методе KeyPressed(int), я вызываю перересовку одной части экрана, и сразу же перерисовку другой части экрана. На практике выходит, что перерисовывается только вторая часть. Долго ломал голову, пока не прошел программу отладчиком. Выходит вот какая странная штуковина, если в методе KeyPressed(int) вызвать пару раз метод repaint(); То на самом деле метод paint(Graphics) вызывается только один раз, по завершению метода KeyPressed(int). Поэтому у меня на экране и отрисовывались только последние изменения. Так что же происходит внутри этого Canvasa, почему paint вызывается только после выхода из KeyPressed и как можно/можно ли это исправить?

Piligrim 27.02.2009 00:36

Ответ: Canvas
 
Просто оба метода являются системными и происходят чаще всего в одной нити. А repaint всего лишь сообщает системе о необходимости вызова paint, а она сама решает когда ей это сделать.

Serg_Bloim 01.03.2009 20:14

Ответ: Canvas
 
Решил, что выходом будет в методе KeyPressed(int) вызвать метод из другого потока и освободить системный поток для своевременной отрисовки. Как правильно приостановить(с возможностью последующего возобновления), как восстановить приостановленный процесс и как его полность остановить? Когда я себе это только планировал, начитавшись разной литературы, мне это казалось проще. В одной книжке прочитал про существование методов suspend() and resume(), но компилятор уверяет меня в их отсутствии. Короче у меня пока не выходит создать работающую модель. Покажите, как можно приостановить поток и продолжить его опять. И что происходит, когда метод run() заканчивается?

Piligrim 02.03.2009 10:57

Ответ: Canvas
 
keyPressed приостанавливать нельзя! Это системный процесс, некому будет отрисовывать.
Зачем нужно ДВА раза отрисовывать экран на одно нажатие клавиши? Обычно хватает одного repaint в самом конце keyPressed. А еще лучше просто сохранить нажатую клавишу в переменную, а в отдельной нити просто ждать изменения этой переменной и там уже отрисовывать хоть сто раз.
По поводу приостановки потока, почитай про wait и notify.
Когда завершается run, заканчивается выполнение нити.

Romanzes 02.03.2009 21:07

Ответ: Canvas
 
Pilgrim, скажи пожалуйста, можно ли вызывать метод Thread.sleep внутри keyPressed? Просто у нас тут вышел спор с товарищем, он утверждает, что это делать категорически нельзя. И если действительно нельзя, как тогда делать задержку?

Piligrim 03.03.2009 00:15

Ответ: Canvas
 
делать этого категорически нельзя, повиснет системная нить и программа может сколько угодна втемную беситься, ни отрисовки, ни реакции на нажатия не будет.
такие методы как keyPressed называются callBack т.е. извещение программы о внешних событиях и должны завершаться как можно быстрее.
PS: Вы мне внятно объясните зачем вам задержка? Я уже не раз объяснял, ява это не МР, другие принципы взаимодействия.

Phantom 03.03.2009 07:51

Ответ: Canvas
 
Romanzes, :tongue: понял? А я тебе что говорил?
pilgrim, Да нам нужно было сделать плавную прокрутку стрницы с текстом. Он мне доказывал, что можно сделать задержку в кейПрессед, ну я по-началу так и сделал, мидлет при такой прокрутке повисал. До меня дошло, что так делать нельзя, и я сделал в отдельном потоке прокрутку текста. При каждом нажатии инициализируется новый поток и текст плавно крутится до тех пор, пока кнопку не отпустят. Сначала я сомневался, правильно ли делаю на этот раз, так как думал, что каждый раз при нажатии создавать новый поток, - это повлияет как-то негативно на работу приложения, но практика показала, что всё отлично работает. Единственное, что обязательно нужно делать - проверять при нажатии инициализирован ли поток и создавать его только в случае, если он не инициализирован :)

Piligrim 03.03.2009 12:31

Ответ: Canvas
 
Как вариант, можно эту самую нить не создавать каждый раз, а просто усыпить ее с помощью wait когда нужно остановить прокрутку. А потом просто разбудить с помощью notify.

Phantom 03.03.2009 12:47

Ответ: Canvas
 
pilgrim, в следующий раз так и сделаю =)


Часовой пояс GMT +4, время: 03:27.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot