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 JFrame
S i JPanel
S?
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 setMinimumSize
i 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 ( JFrame
i 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 BorderLayout
pró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.
setSize()
lubsetBounds()
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 jaksetPreferredSize()
isetMinimumSize()
etc.Upewnij się, że kontener komponentu używa menedżera układu, który przestrzega żądanego rozmiaru.
FlowLayout
,GridBagLayout
ISpringLayout
menedżerów używać komponentu preferowany rozmiar (oba w zależności od ograniczeń ustawionych), aleBorderLayout
iGridLayout
zwykle 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.źródło
setSize
zmieni rozmiar komponentu do określonego rozmiaru.setPreferredSize
ustawia 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.źródło
IIRC ...
setSize
ustawia rozmiar komponentu.setPreferredSize
ustawia 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 ...
źródło