Java: różnica między metodami setPreferredSize () i setSize () w komponentach

105

Jaka jest główna różnica między setSize()i setPreferredSize(). Czasami używałem setSize(), czasami setPreferredSize(), czasami jeden robi, co chcę, czasami drugi.

Jakiego wywołania powinienem użyć dla JFrameS i JPanelS?

David Robles
źródło

Odpowiedzi:

116

Użycie zależy od tego, czy element nadrzędny składnika ma menedżera układu, czy nie.

  • setSize() - użyj, gdy nadrzędny menedżer układu nie istnieje;
  • setPreferredSize()(także powiązane setMinimumSizei setMaximumSize) - użyj, gdy istnieje nadrzędny menedżer układu.

setSize()Metoda prawdopodobnie nie będzie nic robić, gdy rodzic komponentu jest za pomocą menedżera układu; miejsca, w których będzie to zwykle miało wpływ, to komponenty najwyższego poziomu ( JFramei JWindow) oraz elementy wewnątrz przewijanych okienek. Musisz również zadzwonić, setSize()jeśli masz komponenty wewnątrz rodzica bez menedżera układu.

Ogólnie rzecz biorąc, setPreferredSize()układa komponenty zgodnie z oczekiwaniami, jeśli obecny jest menedżer układu; większość menedżerów layoutu pracuje, pobierając preferowane (jak również minimalne i maksymalne) rozmiary swoich komponentów, a następnie używając setSize()i setLocation()ustawiając te komponenty zgodnie z regułami layoutu.

Na przykład, a BorderLayoutpróbuje ustawić granice swojego regionu „północnego” na równe preferowanemu rozmiarowi jego północnego komponentu --- mogą one być większe lub mniejsze, w zależności od rozmiaru JFrame, rozmiaru innych składników w układzie i tak dalej.

Sbodd
źródło
1
Myślałem, że komponent domyślnie używa menedżera układu (BorderLayout?), Więc jeśli nie ustawię wyraźnie menedżera układu, czy to oznacza, że ​​powinienem używać setSize () zamiast setPreferredSize ()?
David Robles
3
Uważam, że JPanels domyślnie używają BorderLayout, ale JComponent nie ma domyślnego układu. W większości przypadków lepiej jest ustawić menedżera układu, jeśli będziesz coś dodawać zamiast używać setSize ().
Sbodd
8
Radzę, aby zawsze używać menedżera układu. SetSize () należy traktować jako coś, co wywołuje menedżer układu, a nie coś, co wywołujesz.
Dzień Kevina
8
@Sbodd - JPanels mają domyślnie FlowLayout. JFrame.getContentPane () ma domyślnie BorderLayout.
Nemi
10

setSize()lub setBounds()może być używany, gdy nie jest używany żaden menedżer układu.

Jednakże, jeśli używasz menedżera układu można dostarczyć wskazówek zarządcy układu używając setXXXSize()metod jak setPreferredSize()i setMinimumSize()etc.

Upewnij się, że kontener komponentu używa menedżera układu, który przestrzega żądanego rozmiaru. FlowLayout, GridBagLayoutI SpringLayoutmenedżerów używać komponentu preferowany rozmiar (oba w zależności od ograniczeń ustawionych), ale BorderLayouti GridLayoutzwykle don't.If ciebie określenie nowych wskazówek dotyczących rozmiaru dla składnika, który jest już widoczny, trzeba wywołać metodę revalidate na aby upewnić się, że jego hierarchia przechowywania została ponownie ułożona. Następnie wywołaj metodę repaint.

Varun
źródło
5

setSize zmieni rozmiar komponentu do określonego rozmiaru.

setPreferredSizeustawia preferowany rozmiar. Komponent może w rzeczywistości nie mieć tego rozmiaru w zależności od rozmiaru kontenera, w którym się znajduje, lub jeśli użytkownik zmienił rozmiar komponentu ręcznie.

Dolina górska
źródło
Czy możesz pokazać pełny przykład setPreferredSize (...). Myślę, że to byłoby pomocne.
Doug Hauf,
4

IIRC ...

setSize ustawia rozmiar komponentu.

setPreferredSizeustawia preferowany rozmiar. Layoutmanager spróbuje zaaranżować tyle miejsca dla twojego komponentu.

To zależy od tego, czy używasz menedżera układu, czy nie ...

miku
źródło
a co jeśli dodam dwa jpanele do jframe bez określania menedżera układu jawnie dla jframe? jaką metodę należy zastosować, aby ustawić rozmiar paneli j?
David Robles
3
Okienka zawartości domyślnie używają BorderLayout ( java.sun.com/docs/books/tutorial/uiswing/layout/using.html ). Tak więc panel treści JFrame ma LayoutManager, więc setPreferredSize powinno działać ..
miku
Brzmi dobrze, to znaczy, że powinienem użyć setSize dla JFrame i setPreferredSize dla komponentów wewnątrz
David Robles
1
Zwykle używałbyś frame.pack (), aby skorzystać z obliczonego preferowanego rozmiaru wszystkich komponentów potomnych. W przeciwnym razie, jeśli użyjesz po prostu losowo frame.setSize (), komponenty dodane do panelu zawartości będą się rozszerzać / zmniejszać, aby dopasować się do dostępnej przestrzeni, co oznacza, że ​​preferowany rozmiar każdego komponentu może zostać nadpisany.
camickr