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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Свой компонент в JScroolPane, как извещать о изменении размера? 
V
    Опции темы
Старовъръ
Дата 6.10.2008, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну вобщем-то size трогать, мне кажется, не следует. Может подобрать подходящий менеджер?
PM MAIL WWW   Вверх
Dims
Дата 7.10.2008, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



Вообще-то в инструкции предлагается переопределять действительно getPreferredSize: https://www.cs.auckland.ac.nz/references/ja...g/practice.html

Но мне всё равно кажется это нелогичным.

Добавлено через 6 минут и 16 секунд
Цитата(Lisus @  6.10.2008,  14:15 Найти цитируемый пост)
*) внутри компонента есть понятие size и getSize должен именно его возвращать (как бин-геттер) и ничего другого

Зависит от того, насколько Вы решаете использовать функционал базового класса.


Цитата(Lisus @  6.10.2008,  14:15 Найти цитируемый пост)
size - возвращает размер (это ОБЪЕКТИВНЫЙ параметр компонента), а вот preferedSize - это Субъективный размер по мнению автора компонента. 

Я воспринимаю иначе. size -- это действительно объективный размер, а вот preferredSize -- это не субъективный, а желаемый размер. Если Вы переопределили paint и нарисовали в нём, допустим, квадрат размером 100х100, то у вас будет объективный размер 100х100. Это не желаемый размер, на который менеджер может наплевать, а именно реальный размер компонента. И тут уже неважно, что там хранится в переменных width и height. Их надо либо правильно заполнить, либо скрыть.

Добавлено через 9 минут и 24 секунды
Цитата(Lisus @  6.10.2008,  23:20 Найти цитируемый пост)
Если не добавлять СкроллПане, а выводить напрямую в фрейм мою панель, то при добавлении новых строк компонент ужимается.

Не совсем понятно, что происходит.

Цитата(Lisus @  6.10.2008,  23:20 Найти цитируемый пост)
setSize - не подходит, он задаёт размер жестко.

Наоборот, setSize задаёт размер нежёстко, так как после задания размера при помощи setSize, никто не мешает менеджеру раскладок задать другой размер. 

Вероятно, надо переопределить ещё и minimunSize и maximumSize

PM MAIL   Вверх
Dims
Дата 7.10.2008, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



Вот кусочек кода BorderLayout:

Код

if ((c=getChild(NORTH,ltr)) != null) {
        c.setSize(right - left, c.height);
        Dimension d = c.getPreferredSize();
        c.setBounds(left, top, right - left, d.height);
        top += d.height + vgap;
    }



Видно, что он смотрит getPreferredSize, думает, а затем тупо вызывает setSize и setBounds.

Отсюда выводы:

1) getSize переопределять бессмысленно
2) нужно уметь реагировать на setSize

Иными словами, в общем случае, изнутри компонента никаким образом нельзя добиться, чтобы он имел какой-то заданный размер. Компонент должен подчиняться лэйаут менеджеру и может только скромно просить его о чём-то при помощи preferred.

Я был неправ, когда отождествлял размер рисунка с размером компонента. Размер рисунка, если можно так выразиться, это размер содержимого компонента. Отключить изменение размера компонента со стороны менеджера мы не можем, поэтому варианта только 2: либо рисовать рисунок такого размера, какой велит менеджер, либо рисовать свой размер, но тогда рисунок будет либо обрезан, либо будет болтаться в углу компонента.
PM MAIL   Вверх
Lisus
Дата 7.10.2008, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Dims @  7.10.2008,  00:02 Найти цитируемый пост)
Не совсем понятно, что происходит.


У меня в большом фрейме после программного добавления размер становиться таким, каким я задал в setSize.
соответственно фон рисуется только в длину 500 пикселов, в то время как сам фрейм в длину 700, и поэтому разница 200 не перерисовывается (не заполняется фоном).
как только повести размер фрейма чуть-чуть , то компонент принимает уже нормальные размеры - во весь фрейм.

Вот и нужно чтобы он это делал уже при добавлении строк.
Корочве вот так получается:
+++++++++++++++++++++++++++
+@@@@@@@@@@@@@                 +
+@@@@@@@@@@@@@                 +
+@@@@@@@@@@@@@                 +
+@@@@@@@@@@@@@                 +
+@@@@@@@@@@@@@                 +
+++++++++++++++++++++++++++

А надо чтобы менеджер растягивал.
При вызове setSize - размеры устанавливаются жестко и никакой менеджер не вызывается.
А НАДОБЫ.

возможно стоит дополнить минимумом и максимумом.

Добавлено через 10 минут и 11 секунд
Цитата(Dims @  7.10.2008,  00:24 Найти цитируемый пост)
Иными словами, в общем случае, изнутри компонента никаким образом нельзя добиться, чтобы он имел какой-то заданный размер. Компонент должен подчиняться лэйаут менеджеру и может только скромно просить его о чём-то при помощи preferred.


Как заставить этот грёбанный менеджер врубиться? Пока для меня это главная проблема.


Цитата(Dims @  7.10.2008,  00:24 Найти цитируемый пост)
Отключить изменение размера компонента со стороны менеджера мы не можем, поэтому варианта только 2: либо рисовать рисунок такого размера, какой велит менеджер, либо рисовать свой размер, но тогда рисунок будет либо обрезан, либо будет болтаться в углу компонента. 


... либо добавлять свойство align, и рисовать Справа , в Центре, Слева компонента.

Насчёт субъективного, я имел в виду, что желания сами по себе субъективны.
PM MAIL   Вверх
Lisus
Дата 7.10.2008, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Dims @  7.10.2008,  00:24 Найти цитируемый пост)
c.setSize(right - left, c.height);
        Dimension d = c.getPreferredSize();
        c.setBounds(left, top, right - left, d.height);


Странно, я всегда думал, что setBounds внутри себя должен сам вызывать setSize и setLocation.
Т.е. что размер, и расположение пользуются теме же переменными, что и Bounds?
Я считал, что setLocation и setSize - это обрезанный setBounds, когда надо переопределить только 2 размера из 4-х.
PM MAIL   Вверх
dorogoyIV
Дата 7.10.2008, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

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



Цитата(Lisus @  7.10.2008,  09:31 Найти цитируемый пост)
Как заставить этот грёбанный менеджер врубиться? Пока для меня это главная проблема.

Код

  myPanel.getLayout().layoutContainer(myPanel);

PM MAIL   Вверх
Lisus
Дата 7.10.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Блин, как всё просто...
А на Нулл проверять не надо? а то может нет менеджера.
PM MAIL   Вверх
dorogoyIV
Дата 7.10.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

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



Цитата(Lisus @  7.10.2008,  11:19 Найти цитируемый пост)
А на Нулл проверять не надо? а то может нет менеджера.

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

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

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


 




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


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

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