Java: різниця між методами setPreferredSize () та setSize () в компонентах


105

У чому головна відмінність між setSize()та setPreferredSize(). Іноді я використовував setSize(), іноді setPreferredSize(), іноді один робить те, що я хочу, іноді інший.

Який дзвінок я повинен використовувати для JFrames та JPanels?

Відповіді:


116

Використання залежить від того, чи має батьківський компонент менеджер компонування чи ні.

  • setSize() - використовувати, коли не існує батьківського менеджера макетів;
  • setPreferredSize()(також пов'язані з ним setMinimumSizeта setMaximumSize) - використовувати, коли існує батьківський менеджер макетів.

setSize()Метод , ймовірно , не буде нічого робити , якщо батько компонента використовує менеджер компонування; місця це, як правило , має ефект буде на компонентах верхнього рівня ( JFrameз і JWindowс) і речами, які всередині прокручуються панелі. Ви також повинні зателефонувати, setSize()якщо у вас є компоненти всередині батька без менеджера макетів.

Як правило, setPreferredSize()викладають компоненти, як очікувалося, якщо присутній менеджер компонування; Більшість менеджерів макетів працюють, отримуючи бажані (а також мінімальні та максимальні) розміри своїх компонентів, потім використовуючи setSize()та setLocation()розміщуючи ці компоненти відповідно до правил компонування.

Наприклад, BorderLayoutнамагається зробити межі своєї "північної" області рівними бажаному розміру її північної складової --- вони можуть закінчитися більшими або меншими, ніж залежно від розміру JFrame, розміру інших компонентів в макеті тощо.


1
Я думав, що компонент використовує диспетчер макетів за замовчуванням (BorderLayout?), Тож якщо я не встановив явно диспетчер макетів, це означає, що я повинен використовувати setSize () замість setPreferredSize ()?
Девід Роблз

3
Я вважаю, що JPanels використовує BorderLayout за замовчуванням, але JComponent не має макета за замовчуванням. У більшості випадків вам краще встановити менеджер макетів, якщо ви будете додавати щось замість того, щоб використовувати setSize ().
Sbodd

8
Моя рекомендація - завжди використовувати менеджер макетів. SetSize () слід розглядати як щось, що викликає менеджер макета - не те, що ви викликаєте.
День Кевіна

8
@Sbodd - JPanels за замовчуванням має FlowLayout. JFrame.getContentPane () за замовчуванням має BorderLayout.
Немі

10

setSize()або setBounds()може використовуватися, коли не використовується диспетчер макетів.

Однак якщо ви використовуєте диспетчер макетів, ви можете надати підказки менеджеру компонування, використовуючи такі setXXXSize()методи, як setPreferredSize()і setMinimumSize()т.д.

І будьте впевнені, що контейнер компонента використовує диспетчер макетів, який дотримується запитуваного розміру. FlowLayout, GridBagLayoutІ SpringLayoutменеджери використовують бажаний розмір компонента (останні два в залежності від обмежень , встановлених вами), але BorderLayoutі , як GridLayoutправило , don't.If вам вказати нові підказки по розміру для компонента , який вже видно, вам потрібно викликати метод перевірити ще раз на щоб переконатися, що її ієрархія стримування буде знову викладена. Потім застосуйте метод перефарбовування.


5

setSize змінить розмір компонента до заданого розміру.

setPreferredSizeвстановлює бажаний розмір. Компонент насправді не може бути такого розміру, залежно від розміру контейнера, у якому він знаходиться, або якщо користувач повторно змінив розмір компонента вручну.


Чи можете ви показати повний приклад setPreferredSize (...). Я думаю, що це було б корисно.
Дуг Хауф

4

IIRC ...

setSize встановлює розмір компонента.

setPreferredSizeвстановлює бажаний розмір. Менеджер макета спробує організувати стільки місця для вашого компонента.

Це залежить від того, використовуєте ви менеджер макета чи ні ...


і що робити, якщо я додаю два jpanel до jframe, не вказуючи явно менеджер макета для jframe? який метод я повинен використовувати для встановлення розміру jpanels?
Девід Роблз

3
На панелях вмісту за замовчуванням використовується BorderLayout ( java.sun.com/docs/books/tutorial/uiswing/layout/using.html ). Отже, на контентній панелі JFrame є LayoutManager, тому setPreferredSize повинен працювати ..
miku

Звучить добре, це означає, що я повинен використовувати setSize для JFrame та setPreferredSize для компонентів всередині
David Robles

1
Зазвичай ви використовуєте frame.pack (), щоб скористатися розрахованим бажаним розміром усіх дочірніх компонентів. В іншому випадку, якщо ви просто випадково використовуєте frame.setSize (), компоненти, додані до області вмісту, розширяться / скорочуються, щоб відповідати наявному простору, а це означає, що бажаний розмір кожного компонента може бути замінений.
camickr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.