Canvas
Кто может объяснить, какая связь между методами KeyPressed(int) и paint(Graphics) класса Canvas?
У меня вот какая проблема: При событии нажатия на клавишу, в методе KeyPressed(int), я вызываю перересовку одной части экрана, и сразу же перерисовку другой части экрана. На практике выходит, что перерисовывается только вторая часть. Долго ломал голову, пока не прошел программу отладчиком. Выходит вот какая странная штуковина, если в методе KeyPressed(int) вызвать пару раз метод repaint(); То на самом деле метод paint(Graphics) вызывается только один раз, по завершению метода KeyPressed(int). Поэтому у меня на экране и отрисовывались только последние изменения. Так что же происходит внутри этого Canvasa, почему paint вызывается только после выхода из KeyPressed и как можно/можно ли это исправить? |
Ответ: Canvas
Просто оба метода являются системными и происходят чаще всего в одной нити. А repaint всего лишь сообщает системе о необходимости вызова paint, а она сама решает когда ей это сделать.
|
Ответ: Canvas
Решил, что выходом будет в методе KeyPressed(int) вызвать метод из другого потока и освободить системный поток для своевременной отрисовки. Как правильно приостановить(с возможностью последующего возобновления), как восстановить приостановленный процесс и как его полность остановить? Когда я себе это только планировал, начитавшись разной литературы, мне это казалось проще. В одной книжке прочитал про существование методов suspend() and resume(), но компилятор уверяет меня в их отсутствии. Короче у меня пока не выходит создать работающую модель. Покажите, как можно приостановить поток и продолжить его опять. И что происходит, когда метод run() заканчивается?
|
Ответ: Canvas
keyPressed приостанавливать нельзя! Это системный процесс, некому будет отрисовывать.
Зачем нужно ДВА раза отрисовывать экран на одно нажатие клавиши? Обычно хватает одного repaint в самом конце keyPressed. А еще лучше просто сохранить нажатую клавишу в переменную, а в отдельной нити просто ждать изменения этой переменной и там уже отрисовывать хоть сто раз. По поводу приостановки потока, почитай про wait и notify. Когда завершается run, заканчивается выполнение нити. |
Ответ: Canvas
Pilgrim, скажи пожалуйста, можно ли вызывать метод Thread.sleep внутри keyPressed? Просто у нас тут вышел спор с товарищем, он утверждает, что это делать категорически нельзя. И если действительно нельзя, как тогда делать задержку?
|
Ответ: Canvas
делать этого категорически нельзя, повиснет системная нить и программа может сколько угодна втемную беситься, ни отрисовки, ни реакции на нажатия не будет.
такие методы как keyPressed называются callBack т.е. извещение программы о внешних событиях и должны завершаться как можно быстрее. PS: Вы мне внятно объясните зачем вам задержка? Я уже не раз объяснял, ява это не МР, другие принципы взаимодействия. |
Ответ: Canvas
Romanzes, :tongue: понял? А я тебе что говорил?
pilgrim, Да нам нужно было сделать плавную прокрутку стрницы с текстом. Он мне доказывал, что можно сделать задержку в кейПрессед, ну я по-началу так и сделал, мидлет при такой прокрутке повисал. До меня дошло, что так делать нельзя, и я сделал в отдельном потоке прокрутку текста. При каждом нажатии инициализируется новый поток и текст плавно крутится до тех пор, пока кнопку не отпустят. Сначала я сомневался, правильно ли делаю на этот раз, так как думал, что каждый раз при нажатии создавать новый поток, - это повлияет как-то негативно на работу приложения, но практика показала, что всё отлично работает. Единственное, что обязательно нужно делать - проверять при нажатии инициализирован ли поток и создавать его только в случае, если он не инициализирован :) |
Ответ: Canvas
Как вариант, можно эту самую нить не создавать каждый раз, а просто усыпить ее с помощью wait когда нужно остановить прокрутку. А потом просто разбудить с помощью notify.
|
Ответ: Canvas
pilgrim, в следующий раз так и сделаю =)
|
Часовой пояс GMT +4, время: 13:41. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot