![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Lisus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 21.10.2007 Репутация: 1 Всего: 2 |
Вопрос собствеено уже задан.
Есть свой компонент наследуемый от JPanel. В процессе добавления новых данный он должен увеличиваться. Логично засунуть его в JScrollPane, а вот как обвёртку извещать о новых размерах? |
|||
|
||||
dorogoyIV |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 36 Всего: 46 |
хм, так не надо ничего делать, все само должно работать
|
|||
|
||||
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
А как оно само-то может отработать? Мало ли что я там нарисую?
|
|||
|
||||
Старовъръ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.5.2008 Репутация: нет Всего: 10 |
Т.к. наследуется компонент от JPanel, то последний сам все сообщает скроллу.
-------------------- |
|||
|
||||
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
||||
|
||||
Старовъръ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.5.2008 Репутация: нет Всего: 10 |
Если ты нарисуешь линию в км, то компонент не изменит своих размеров, просто линию не будет видно и все. Размеры меняются в зависимости от preferred, minimum, maximum Sizes. На них смотрит менеджер компановки и составляет пропорции, относительно всех остальных компонентов. А вот как определяет размеры внутренних компонентов JScrollPane мне и самому интересно...
-------------------- |
|||
|
||||
dorogoyIV |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 36 Всего: 46 |
тогда устанавливай на свою панель новые размеры
Добавлено через 5 минут и 25 секунд
JScrollPane как раз вот и берет PreferredSize компонента, а размер этого компонента знает LayoutManager |
||||
|
|||||
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Мне кажется, что логичней переопределить getSize. То есть, я переопределяю рисование компонента и я же переопределяю понятие о его размерах. Добавлено через 5 минут и 28 секунд
Я так понимаю, что менеджер компоновки делает вот что: (1) смотрит на всякие подсказки, которые ему даёт компонент (сюда входят всякие getPreferred, getMaximum и так далее), (2) думает, как ему расположить компоненты, при этом он может проигнорировать подсказки, (3) вызывает у компонентов методы setSize, чтобы задать размер, (4) смотрит, что получилось при помощи getSize и (5) раскладывает. Если мы вызовем setPreferredSize, то менеджер может его и проигнорировать. Хотя менеджер скролла (там какой-то свой) наверняка не проигнориует, но мне кажется, что это будет не очень коррекно. Ведь этот метод определяет лишь ЖЕЛАЕМЫЙ размер. А нам надо задать ФАКТИЧЕСКИЙ. |
|||
|
||||
Старовъръ |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.5.2008 Репутация: нет Всего: 10 |
![]()
Думаю лучше не гадать что делают менеджеры, а просто где-нибудь об этом почитать, если есть желание. И конечно же опубликовать выводы в данной теме. Это сообщение отредактировал(а) Старовъръ - 6.10.2008, 06:36 -------------------- |
||||
|
|||||
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
||||
|
||||
Lisus |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 21.10.2007 Репутация: 1 Всего: 2 |
Прошу прощения, что обсуждение без меня проходит. Действительно все делается само.
Вот пример что примерно надо было сделать. Сама панель-компонент
И пусковой фрейм.
Запускаем фрейм и ждем немного. Скролл реагирует правильно. Спасибо. |
||||
|
|||||
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
А попробуйте переопределить не getPreferredSize, а getSize. Будет работать?
|
|||
|
||||
Старовъръ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.5.2008 Репутация: нет Всего: 10 |
-------------------- |
|||
|
||||
Lisus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 21.10.2007 Репутация: 1 Всего: 2 |
Dims
Видете ли работать оно может и будет, но... При проектировании систем (например GUI) обычно одни методы делаются специально для переопределения (иногда просто абстрагируют их), а другие - для внутренней работы системы (их трогать не полагается). По мне getSize относится ко вторым, а getPreferredSize к первым. И на это есть свои причины: *) в литературе в качестве примеров указывали для переопределения именно preferredSize *) внутри компонента есть понятие size и getSize должен именно его возвращать (как бин-геттер) и ничего другого *) size - возвращает размер (это ОБЪЕКТИВНЫЙ параметр компонента), а вот preferedSize - это Субъективный размер по мнению автора компонента. Согласитесь, что машина не может понять какой бы размер был самым лучшим. И без человека здесь никак. Ещё пара мыслей... Я так понимаю, что систему мы извещаем о том какой по нашему мнению компонент должен занимать размер участка. далее нашу просьбу обрабатывает система и своё решение прячет в size. Заметьте обе величины могут и не совпадать. Например в том же примере. Если скролл больше чем желаемый размер, то компонент получает весь размер скролла. (помойму) А если размер не влизает в отведённую область, то устанавливается именно желаемый размер. Да и зачем переопределять getSize если размер можно самому задать через setSize? |
|||
|
||||
Lisus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 21.10.2007 Репутация: 1 Всего: 2 |
Народ, проблема осталась.
Если не добавлять СкроллПане, а выводить напрямую в фрейм мою панель, то при добавлении новых строк компонент ужимается. Т.е. если сам фрейм растянуть на 700, а компонент в длину 500, то после принудительного задания размера получается, что компонент занимает всего 5\7 длинны фрейма. В то время как менеджер расскладок должен его вытягивать на всю длинну. Значит должно быть событие, которое сообщает об изменении размера, но чтобы вызывался менеджер расскладки и уже сам дул какой размер назначить компоненту. setSize - не подходит, он задаёт размер жестко. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |