Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перерисовка в Java, Перерисовка в Java 
:(
    Опции темы
nighthare
Дата 23.3.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



Приветсвую!

У меня возникла такая задачка - есть много объектов которые я рисую и отображаю на canvas. Сначала все объекты (для примера круги) рисуются в BufferedImage, после чего BufferedImage рисуется на экране. Я хочу изменить положение одного круга, и вывести обновленную картинку на экране. Пришло в голову 2 способа, которые мне не подходят

1. при смещении одного объекта заного перерисовать все остальные. Минус этого способа - У меня может быть много вершин, и как следсвие рисовать все очень долго, и при движении вершины будут тормоза

2. Нарисовать все кроме той, которую я хочу подвинуть. и поверх новой BufferedImage рисовать нужную мне вершину.
Минус - каждый раз нужно создовать копию BufferedImage что крайне долго, а если она еще и большая то можно получить ошибку, heap size.

Хотелось иметь быстрый способ, наподобии 'сделать undo draw'. или любой другой алгоритм позволяющий быстро перерисовать один элемент.


Это сообщение отредактировал(а) nighthare - 24.3.2009, 21:08
PM MAIL   Вверх
kamre
Дата 24.3.2009, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Proger10
Дата 25.3.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Цитата
Обычно делается partial update, т.е. перерисовывается только самое необходимое.

Но как можно перерисовать только кусок (например, если отрисовка производится на компоненте JPanel)?

Цитата
Еще не очень понятно, зачем сначала отрисовывать в BufferedImage, т.к. Swing и так делает double buffering сам. 

Ну например для того, чтобы после минимизации окна картинка не исчезала. Или этого тоже можно как-то избегать без применения BufferedImage?
PM MAIL   Вверх
kamre
Дата 26.3.2009, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 2
Всего: 13



Цитата(Proger10 @ 25.3.2009,  23:07)
Но как можно перерисовать только кусок (например, если отрисовка производится на компоненте JPanel)?


Нужно создать новый класс и перегрузить метод paintComponent. В него приходит объект Grpahics, у которого есть getClip и getClipBounds, поэтому перерисовывать нужно только то, что внутри этих границ. 

Цитата(Proger10 @ 25.3.2009,  23:07)
Ну например для того, чтобы после минимизации окна картинка не исчезала. Или этого тоже можно как-то избегать без применения BufferedImage?


Какая еще картинка? Если речь о приложении вида MS Paint, то действительно нужно все держать в BufferedImage и в paintComponent отрисовывать нужные куски из этой картинки. Но речь изначально шла о приложениях другого типа: отображение структурированной графики, т.е. когда есть model с элементами и нужно отрисовывать эту model в некотором view. При этом когда model изменяется, нужно перерисовать только то, что изменилось, а не всю model.
PM MAIL   Вверх
Proger10
Дата 26.3.2009, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Цитата
В него приходит объект Grpahics, у которого есть getClip и getClipBounds, поэтому перерисовывать нужно только то, что внутри этих границ. 

границами getClipBound и будет определена та область, которая изменилась?

Цитата
Какая еще картинка?

а.. сорри. Походу я махнул лишнего smile
PM MAIL   Вверх
kamre
Дата 27.3.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 2
Всего: 13



Цитата(Proger10 @ 26.3.2009,  23:40)
Цитата
В него приходит объект Grpahics, у которого есть getClip и getClipBounds, поэтому перерисовывать нужно только то, что внутри этих границ. 

границами getClipBound и будет определена та область, которая изменилась?

Не которая изменилась, а которую нужно перерисовать (может быть ничего и не изменилось, а просто другое окно поверх нашего двигают). А вот когда изменилось что-то внутри программы, то нужно вычислить bounds и, например, позвать repaint(bounds) для компонента который отображает модель.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.