![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| nighthare |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 24.12.2005 Репутация: нет Всего: нет |
Приветсвую!
У меня возникла такая задачка - есть много объектов которые я рисую и отображаю на canvas. Сначала все объекты (для примера круги) рисуются в BufferedImage, после чего BufferedImage рисуется на экране. Я хочу изменить положение одного круга, и вывести обновленную картинку на экране. Пришло в голову 2 способа, которые мне не подходят 1. при смещении одного объекта заного перерисовать все остальные. Минус этого способа - У меня может быть много вершин, и как следсвие рисовать все очень долго, и при движении вершины будут тормоза 2. Нарисовать все кроме той, которую я хочу подвинуть. и поверх новой BufferedImage рисовать нужную мне вершину. Минус - каждый раз нужно создовать копию BufferedImage что крайне долго, а если она еще и большая то можно получить ошибку, heap size. Хотелось иметь быстрый способ, наподобии 'сделать undo draw'. или любой другой алгоритм позволяющий быстро перерисовать один элемент. Это сообщение отредактировал(а) nighthare - 24.3.2009, 21:08 |
|||
|
||||
| kamre |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 2 Всего: 13 |
Обычно делается partial update, т.е. перерисовывается только самое необходимое. Если перемещаемый объект небольшого размера, то необходима перерисовка только небольшого участка. Начинать можно с перерисовки bounding rectangle для всех изменений, так обычно Swing перерисовывает компоненты. Для более сложных случаев можно представлять область для перерисовки в виде множества rectangles, как вот здесь.
Да и вообще рекомендую загрузить Qt и запустить QtDemo->Demonstrations->40000 chips. В этой демке как раз много элементов, которые можно перемещать мышкой. Если запустить debug версию с переменной окружения QT_FLUSH_PAINT=1, то будут подсвечиваться те части, для которых делается перерисовка при перетаскивании элемента. Еще не очень понятно, зачем сначала отрисовывать в BufferedImage, т.к. Swing и так делает double buffering сам. С одним экземпляром BufferedImage уже можно иметь undo: вначале движения один раз рисуем фон на BufferedImage, а затем делаем drawImage для фона и поверх рисуем передвигаемый компонент. Это сообщение отредактировал(а) kamre - 24.3.2009, 23:24 |
|||
|
||||
| Proger10 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
Но как можно перерисовать только кусок (например, если отрисовка производится на компоненте JPanel)?
Ну например для того, чтобы после минимизации окна картинка не исчезала. Или этого тоже можно как-то избегать без применения BufferedImage? |
||||
|
|||||
| kamre |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 2 Всего: 13 |
Нужно создать новый класс и перегрузить метод paintComponent. В него приходит объект Grpahics, у которого есть getClip и getClipBounds, поэтому перерисовывать нужно только то, что внутри этих границ.
Какая еще картинка? Если речь о приложении вида MS Paint, то действительно нужно все держать в BufferedImage и в paintComponent отрисовывать нужные куски из этой картинки. Но речь изначально шла о приложениях другого типа: отображение структурированной графики, т.е. когда есть model с элементами и нужно отрисовывать эту model в некотором view. При этом когда model изменяется, нужно перерисовать только то, что изменилось, а не всю model. |
||||
|
|||||
| Proger10 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
границами getClipBound и будет определена та область, которая изменилась?
а.. сорри. Походу я махнул лишнего |
||||
|
|||||
| kamre |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 2 Всего: 13 |
Не которая изменилась, а которую нужно перерисовать (может быть ничего и не изменилось, а просто другое окно поверх нашего двигают). А вот когда изменилось что-то внутри программы, то нужно вычислить bounds и, например, позвать repaint(bounds) для компонента который отображает модель. |
||||
|
|||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |