2009-11-23 10 views

Odpowiedz

105

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.

+1

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()? –

+3

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

+8

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. –

5

setSize zmieni rozmiar komponent do określonego rozmiaru.

setPreferredSize ustawia preferowany rozmiar. Komponent może w rzeczywistości nie być tym rozmiarem, w zależności od rozmiaru kontenera, w którym się znajduje lub od zmiany rozmiaru komponentu ręcznie.

+0

Czy możesz pokazać pełny przykład setPreferredSize (...). Myślę, że byłoby to pomocne. –

4

IIRC ...

setSize ustawia wielkość 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 lub nie ...

+0

i co się stanie, jeśli dodaję dwa jpanele do jframe bez wyraźnego określenia menedżera układu jawnie dla jframe? jakiej metody powinienem użyć, aby ustawić rozmiar jpaneli? –

+3

Domyślnie zawartość okien używa BorderLayout (http://java.sun.com/docs/books/tutorial/uiswing/layout/using.html). Więc contentpane JFrame ma LayoutManager, więc setPreferredSize _should_ work .. – miku

+0

Brzmi nieźle, to znaczy powinienem użyć setSize dla JFrame i setPreferredSize dla komponentów wewnątrz –

9

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

Jednakże, jeśli używasz menedżera układu można dostarczyć wskazówek zarządcy układu za pomocą metody setXXXSize() jak setPreferredSize() i setMinimumSize() itp

I mieć pewność, że pojemnik na komponentu używa menedżera układ, który szanuje wnioskowana rozmiar.Menedżerowie FlowLayout, i SpringLayout używają preferowanego rozmiaru komponentu (te dwa ostatnie zależą od ustawionych ograniczeń), ale zwykle nie. Jeśli podasz nowe wskazówki dotyczące rozmiaru komponentu, który jest już widoczny, musisz wywołaj metodę revalidate, aby upewnić się, że jej hierarchia powstrzymywania jest ponownie rozłożona. Następnie wywołaj metodę odświeżania.

Powiązane problemy