![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
dre |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Значит задача такая: есть большая панель с заполненым Графиксом, надо из этой панели вырезать скажем где-то в середине прямоугольник и присвоить его другой панели размером как раз с этот прямоугольник. Причем чтобы на маленькой панели прямоугольник должен расположиться с координаты (0,0). Буду рад любому совету.
|
|||
|
||||
corewithin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 1.11.2005 Репутация: 1 Всего: 1 |
Наследуешь маленькую панель от большой и в методе переопределенном методе paint(Graphics g) вызываешь клипание Графикса
|
|||
|
||||
dre |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Не получается так. Значит в переопределенном методе
а на панельке все равно появляется содержание большой с самого начала т.е. с (0,0) и все что вместилось дальше причем на размеры клипа плевать все хотели а мне надо чтобы отобразился участок только с (0,500) и переместился на начало координат. Добавлено @ 20:02 в принципе если поменять местами команды, то он будет отображать только этот участок, но в той же координате, а надо его еще переместить в начало координат, как? Это сообщение отредактировал(а) dre - 28.7.2006, 19:49 |
|||
|
||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 31 Всего: 159 |
По данному вопросу у меня имеется предложение след. характера: Определите в классе JPanel вот такой метод:
Так можно получить любой регион панельки в виде BufferedImage. А далее прорисовываете полученную картинку куда захочется. |
|||
|
||||
dre |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
В принципе такой способ работает, только надо вызывать не super.paint(g); a this.paint(g);
Но какой-то не красивый способ, через картинки очень ресурсоемко и не понаучному ![]() Это сообщение отредактировал(а) dre - 29.7.2006, 14:25 |
|||
|
||||
powerOn |
|
||||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 31 Всего: 159 |
всецело согласен.
нет, перерисовываете всю панель в буфер, а потом выделяете getSubimage() двадцать необходимых регионов. И как я понимаю, getSubimage() не копирует данные и не создает новый рисунок, а возврашает ссылку на регион оригинального рисунка ввиде BufferedImage. Это сообщение отредактировал(а) MoonCat - 29.7.2006, 17:10 |
||||
|
|||||
dre |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
В принципе я так уже и сделал, но теперь есть другая проблема, дело в том что когда я создаю BufferedImage объект то надо задать размеры начальные, а их я в этот момент не знаю, в частности высоту, т.к. чтобы их узнать мне надо вызвать paint панели там они и определяются. Способ задать картинку заведомо большого размера не пойдет, можно ли как-то вызвать этот paint заранее для какого-либо графикса но не задавая ему размеров и не отображая на экране.
|
|||
|
||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 31 Всего: 159 |
боюсь что нет. Может добавить дополнительный метод для расчета панели? Или агрегировать в панель BufferedImage и прорисовывать в него всю панеть когда необходимо, а потом возвращать её внешним объектам.. так можно будет из метода paint() в буфер положить катринку когда её размеры станут известы... |
|||
|
||||
dre |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Как тяжело исправлять свои ошибки а предусмотреть их еще трудней
![]() беда...
Мне сначала нада получить весь нарисованный обект будь то графикс или буфер, а потом с ним делать, что захочу в частности резать и вставлять. На даныый момент сначала в paint рисуется вся панель потом, по совету добрых людей, переносится на картинку и из нее режется и вставляется. Сейчас картинка задается заведомо большого размера чтобы все поместилось, но всегда ведь найдется что-то больше чем надо... поэтому надо узнать как-то перед переносом на картинку размер нарисованного, а это можно сделать лишь вызвав paint панели, значит надо как-то его вызвать раньше... а как... З.Ы. объяснил как смог, если не запутал, то это уже успех! Это сообщение отредактировал(а) dre - 30.7.2006, 12:30 |
|||
|
||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 31 Всего: 159 |
Вообще говоря размер буфера (BufferedImage) можно установить как размер панели на котором происходит прорисовка. а вот это кстати почему? Метод paint получает неизменяемый по размерам Graphics (его размеры совпадают с размерами панели)... как Вы эти размеры определяете? Хотелось бы код посмотреть... |
|||
|
||||
dre |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
То есть я так понял, что если я буду рисовать на графиксе в координате большей чем ее размеры то произойдет исключение что ли?
Так в этом то и проблема, что сама панель тоже пока задается с начальными размерами которые превосходят размеры того что на ней рисуется. В самом же paint -е достаютя данные из базы и рисуются как drawString(...), а изночально я не знаю сколько там будет этих данных, они зависят от многих условий, соответственно количество строчек я тоже сначала определить не могу, а определяю только когда они уже нарисованы. Такая засада... То есть уже потом мне надо выставитьть соответстующие размеры и панели и картинки. Я уже начинаю подозревать, что в где-то в самом начале разработки я допустил теперь уже неиспровимую ошибку. Вот если бы был такой безразмерный графикс на котором можно бы было рисовать все что угодно, а потом уже обрезать как захочется, надо сановцам идею подкинуть ![]() Это сообщение отредактировал(а) dre - 30.7.2006, 13:34 |
|||
|
||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 31 Всего: 159 |
нет, исключения не будет, просто на экране отобразится только то, что попало в реальные размеры. А что не попало то бесследо пропадет. Мне кажется в вашем случае, необходимо написать метод определяющий необходимые размеры буфера, потом рисовать в него (внеэкранно, как при двойной буферезации) все что необходимо. Далее это буфер может быть быстро выведен на экран или отдан другому объекту. |
|||
|
||||
dre |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Это получается, что сначала надо пройти всю процедуру посчета количества строк, потом установить размеры буфера, а потом заново пройти эту процедуру, но уже с отображением в буфер. А еще проблема в том что на поле шириной в 500 количество строк будет одно, а при ширине в 100 совсем другое, гораздо большее. То есть процедуры разбиения строчек и рисования на панель либо в буфер (мне в принципе без разницы куда) и доставания этих строчек неразделимы.
т.е. в графиксе содержание все таки будет, ето только если сама панель меньше, то часть на нее не попадет. Но саму панель мне ведь не надо выводить, а только брать ее графикс в котором все есть, следовательно
мне все равно какого размера панель, главное установить потом размеры картинки нужные. т.е просто надо вызвать paint панели чтобы узнать размер, а потом еще раз этот paint только уже paint(buf.getGraphics()) А как заставить вызваться paint в первый раз? я пока не додумался... |
||||||
|
|||||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 31 Всего: 159 |
нет, не будет. Лишнее просто не прорисуется и все. Добавлено @ 15:06 И потом, Graghics это абстрактный класс его реализуют другие классы поддерживающие рисование т. ск. на себе. Он представляет интерфейс который можно использовать для выполнения рисования. Никаких данных graphics не хранит. Данные о том что прорисованно на компоненте сохраняет сам компонент, который объект графикс и предоставляет. Получив graphics объекта, вы просто получаете возможность рисовать на нем, не больше. |
|||
|
||||
dre |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Согласен, об этом я почему-то совсем не подумал когда писал. Хорошо что есть такие люди которые поставят на путь истиный.
Но проблема все равно остается, а время бежит неумолимо... Это сообщение отредактировал(а) dre - 30.7.2006, 18:09 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |