Krótka odpowiedź brzmi: to skomplikowane.
Nieco dłużej odpowiedź brzmi: używaj setSize()
jeśli rodzic komponentu nie ma żadnego menedżera układu i setPreferredSize()
i powiązanego setMinimumSize
i setMaximumSize
jeśli to robi.
setSize()
prawdopodobnie nic nie zrobi, jeśli rodzic komponentu używa menedżera układu; Miejscami, w których zwykle będzie to miało wpływ, będą komponenty najwyższego poziomu (JFrames
i JWindows
) oraz rzeczy, które są w środku scrolled panes
. Musisz także zadzwonić pod numer setSize()
, jeśli masz komponenty wewnątrz jednostki nadrzędnej bez menedżera układu.
Zgodnie z ogólną zasadą, setPreferredSize()
powinien zrobić "właściwą rzecz", jeśli masz menedżera układu; większość menedżerów układów pracuje, pobierając preferowane (jak również minimalne i maksymalne) rozmiary swoich komponentów, a następnie używając setSize()
i setLocation()
do pozycjonowania tych komponentów zgodnie z regułami układu. Tak więc (jako przykład) BorderLayout
spróbuje ustawić granice jego "północnego" obszaru równe preferred size
jego północnego komponentu - mogą one zakończyć się większym lub mniejszym, w zależności od rozmiaru jframe
, rozmiaru pozostałe komponenty układu i tak dalej.
Myślałem, że komponent domyślnie korzystał z menedżera układu (BorderLayout?), Więc jeśli nie ustawię bezpośrednio menedżera układu, oznacza to, że powinienem użyć metody setSize() zamiast setPreferredSize()? –
Wierzę, że JPanels domyślnie używa BorderLayout, ale JComponent nie ma domyślnego układu. Najczęściej lepiej jest ustawić menedżera układu, jeśli będziesz dodawał coś, zamiast używać setSize(). – Sbodd
Moja rekomendacja to zawsze używać menedżera układu. SetSize() powinno być traktowane jako coś, co wywołuje menedżer układu - a nie coś, co wywołujesz. –