![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
freshAngel |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Привет, очень интересно почему происходит следующая вещь.
Простой пример программы.
Интересная вещь. Если поставить setResizable(false) выдается одно значение размеров окна, в моем случае например: java.awt.Dimension[width=374,height=296] java.awt.Dimension[width=374,height=296] А если setResizable(true) размер окна увеличивается: java.awt.Dimension[width=384,height=306] java.awt.Dimension[width=384,height=306] Хотя само окно ни коем образом не меняется! С чем это связано!? Я конечно понимаю, что если использовать pack(), устанавливающий все размеры объектов на форме в PrefferedSize - то все сухо и прекрасно Smile Но мне во первых хочется понять почему так, а во вторых я использую setBounds() для установки размеров окна. |
|||
|
||||
Turinets |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 24.2.2009 Репутация: нет Всего: нет |
Ну если приглядеться, то можно увидеть, что границы фрейма с изменяющимися размерами больше, чем у стационарного. Другими словами фрейм в Шубе будет больше чем в майке.
А вот что меня удивляет, так это то, что меняется и внутренняя часть:
А ведь размеры внутренней части ДОЛЖНЫ оставаться неизменными. В соседнем топике парень хотел сделать фрейи с заданными размерами внутренней части фрейма. У меня на винде такая вещь выходит: что при setResizeable(false) получается правильные размеры 200,200. А без него 202,202. И вот это я совсем не понимаю. Тебя не должны интересовать размеры фрейма, тебе нужны размеры именно внутренней части, а сам фрейм - это просто обводка вокрух них. |
|||
|
||||
freshAngel |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
![]() Все - же хорошо, что есть pack() Выход из положения придумал такой:
А еще интересно почему вместо pack() не работает такая конструкция:
|
||||||
|
|||||||
Turinets |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 24.2.2009 Репутация: нет Всего: нет |
А зачем тебе фиксированный размер окна?
Если нужен именно фиксированный размер фрейма, то тут кроме setSize() ничего и не нужно. pack() использовать смысла нет. Вроде если менять размер, то все внутреннии контейнеры выровняются "по линии" как надо (как компоновщик скажет), если надо вызвать самому, то getContentPane().doLayuot(); А что зачит не работает? Какой эффект должен быть по вашему, которого нет? |
|||
|
||||
freshAngel |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Почему pack() != setSize(this.getPreferredSize()); Ведь это одно и тоже. Что касается фиксированного размера фрейма, тут тоже странно. Например, setSize(200,200) при setResizable(true) дает лишние отступы примерно в 2px по краям фрейма. Хотя я задал фиксированный размер! При использовании pack(), размер фрейма автоматически подстраивается под нужный. |
|||
|
||||
Turinets |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 24.2.2009 Репутация: нет Всего: нет |
А разве это должно быть одним и темже?
getPrefferedSize() даёт установленные тобой "Предпочтительный" размер. pack() опрашивает внутренние контейнеры и на основании их предпочтительных размеров (или минимальных точно не помню) будет и подгоняться внешний компонент. Т.е. если у тебя предпочтительный размер фрейма 300,300 , а у панели предпочтительный 400,400 , то pack() сделает размеры примерно 400,400, а вот setSize(getPrefferedSize()) сделает размеры близкие к 300,300. pack() - это очень хитрая вещь. Согласись, что "подстроить под нужный" двумя строчками кода нельзя. Там хитрый алгоритм. pack() старается сжать внешние контейнеры исходя из размеров внутренних. |
|||
|
||||
freshAngel |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Хмм. А разве размер фрейма не должен принимать предпочтительные размеры панели установленной в него методом setContentPane() Тогда почему не работает такая конструкция: setSize(panel.getPrefferedSize()) != this.pack(); setSize() - в данном случае содержит именно предпочтительные размеры панели. |
|||
|
||||
Turinets |
|
||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 24.2.2009 Репутация: нет Всего: нет |
Пусть ты сделал так:
panel.setPreferredSize(new Dimension(300,300)); Теперь если Ты сделаешь так: frame.setSize(panel.getPreferredSize()) то фрейм примет размеры (300,300), а если так: frame.pack() фрейм станет скажем (306, 326).
У меня этот код выдает:
Из чего видим, что в первом случае pack() ОБВОРАЧИВАТ панель с размерами, а во втором случае сам принимает такие размеры, из-за чего внутренней панели приходиться немного уменьшется. Пойми, что сам фрейм имеет не нулевую толщину границ, например 306 получается путём добавление к 300 пикселам панели 2 границы по 3 пиксела с двух сторон, а 327 получается потому, что у фрейма есть вверху TitleBar. В любом случае Размеры самого фрейма будут больше, чем размеры внутренней панели. и они отличаются на толщину гранищы. Размер фрейма = размер левой границы + размер панели + размер правой границы. Т.е. размер фрейма != размеру панели и это очевидно. Точно так же, как обхват талии девушки в шубе будет больше, чем без шубы, потому что сама шуба имеет не нулевую толщину. Если ты про это. Предположим талия у КАТИ условно 60 см. ШУБА.pack() придаст шубе такой размер, который удобен для девушки, т.е. 60см+5см = 65см. А ШУБА.setSize(КАТЯ.getPreferredSize()) заставит Катю немного похудеть. |
||||
|
|||||
freshAngel |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Пример с Катей удался ![]() Проверил, осознал! Спасибо. Если касаться основного вопроса, то получается setResizable(true) либо setResizable(false), дополнительно увеличивает либо уменьшает границы фрейма соотвественно!?
Понял! Спасибо большое, разобрался! ![]() Это сообщение отредактировал(а) freshAngel - 21.3.2009, 23:35 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |