Java: Unterschied zwischen den Methoden setPreferredSize () und setSize () in Komponenten

105

Was ist der Hauptunterschied zwischen setSize()und setPreferredSize(). Manchmal habe ich verwendet setSize(), manchmal setPreferredSize(), manchmal macht einer, was ich will, manchmal der andere.

Welchen Anruf soll ich für JFrames und JPanels verwenden?

David Robles
quelle

Antworten:

116

Die Verwendung hängt davon ab, ob das übergeordnete Element der Komponente über einen Layout-Manager verfügt oder nicht.

  • setSize() - verwenden, wenn kein übergeordneter Layout-Manager vorhanden ist;
  • setPreferredSize()(auch das zugehörige setMinimumSizeund setMaximumSize) - wird verwendet, wenn ein übergeordneter Layout-Manager vorhanden ist.

Die setSize()Methode wird wahrscheinlich nichts tun, wenn das übergeordnete Element der Komponente einen Layout-Manager verwendet. Die Stellen, an denen sich dies normalerweise auswirkt , sind Komponenten ( JFrames und JWindows) der obersten Ebene und Dinge, die sich in gescrollten Fenstern befinden. Sie müssen auch anrufen, setSize()wenn Sie Komponenten in einem übergeordneten Element ohne Layout-Manager haben.

Im Allgemeinen setPreferredSize()werden die Komponenten wie erwartet angeordnet, wenn ein Layout-Manager vorhanden ist. Die meisten Layout-Manager ermitteln die bevorzugten (sowie minimalen und maximalen) Größen ihrer Komponenten und verwenden setSize()und setLocation()positionieren diese Komponenten dann gemäß den Layoutregeln.

Zum Beispiel BorderLayoutversucht a, die Grenzen seiner "Nord" -Region gleich der bevorzugten Größe seiner Nordkomponente zu machen - sie können je nach Größe der JFrame, der Größe der anderen Komponenten größer oder kleiner werden im Layout und so weiter.

Sbodd
quelle
1
Ich dachte, eine Komponente verwendet standardmäßig einen Layout-Manager (BorderLayout?). Wenn ich also keinen Layout-Manager explizit festlege, bedeutet das, dass ich setSize () anstelle von setPreferredSize () verwenden sollte.
David Robles
3
Ich glaube, JPanels verwenden standardmäßig BorderLayout, aber JComponent hat kein Standardlayout. In den meisten Fällen ist es besser, einen Layout-Manager festzulegen, wenn Sie etwas hinzufügen, anstatt setSize () zu verwenden.
Sbodd
8
Meine Empfehlung ist, immer einen Layout-Manager zu verwenden. SetSize () sollte als etwas betrachtet werden, das der Layout-Manager aufruft - nicht als etwas, das Sie aufrufen.
Kevin Day
8
@Sbodd - JPanels haben standardmäßig ein FlowLayout. JFrame.getContentPane () verfügt standardmäßig über ein BorderLayout.
Nemi
10

setSize()oder setBounds()kann verwendet werden, wenn kein Layout-Manager verwendet wird.

Wenn Sie jedoch einen Layout-Manager verwenden, können Sie dem Layout-Manager mithilfe der setXXXSize()Methoden wie setPreferredSize()und setMinimumSize()usw. Hinweise geben .

Stellen Sie außerdem sicher, dass der Container der Komponente einen Layout-Manager verwendet, der die angeforderte Größe berücksichtigt. Das FlowLayout, GridBagLayoutund SpringLayoutManager nutzen die bevorzugte Größe der Komponente (die beiden letzteren auf die Einschränkungen in Abhängigkeit von Ihnen festgelegten), aber BorderLayoutund GridLayoutin der Regel don't.If Sie neue Größenhinweise für eine Komponente angeben , die bereits sichtbar ist, müssen Sie die revalidate Methode aufzurufen auf um sicherzustellen, dass die Containment-Hierarchie erneut festgelegt wird. Rufen Sie dann die Repaint-Methode auf.

Varun
quelle
5

setSize Ändert die Größe der Komponente auf die angegebene Größe.

setPreferredSizelegt die bevorzugte Größe fest. Abhängig von der Größe des Containers oder wenn der Benutzer die Komponente manuell neu dimensioniert, hat die Komponente möglicherweise nicht diese Größe.

Tal
quelle
Können Sie ein vollständiges Beispiel für setPreferredSize (...) zeigen? Ich denke, das wäre hilfreich.
Doug Hauf
4

IIRC ...

setSize Legt die Größe der Komponente fest.

setPreferredSizelegt die bevorzugte Größe fest. Der Layoutmanager versucht, so viel Platz für Ihre Komponente bereitzustellen.

Es hängt davon ab, ob Sie einen Layout-Manager verwenden oder nicht ...

miku
quelle
und was ist, wenn ich einem Jframe zwei Jpanels hinzufüge, ohne explizit einen Layout-Manager für den Jframe anzugeben? Mit welcher Methode sollte ich die Größe der Jpanels einstellen?
David Robles
3
Inhaltsfenster verwenden standardmäßig BorderLayout ( java.sun.com/docs/books/tutorial/uiswing/layout/using.html ). Der Inhaltsbereich des JFrames verfügt also über einen LayoutManager, sodass setPreferredSize funktionieren sollte .
miku
Hört sich gut an, das heißt, ich sollte setSize für den JFrame und setPreferredSize für die Komponenten im Inneren verwenden
David Robles
1
Im Allgemeinen verwenden Sie frame.pack (), um die berechnete bevorzugte Größe aller untergeordneten Komponenten zu nutzen. Wenn Sie andernfalls Frame.setSize () zufällig verwenden, werden die dem Inhaltsbereich hinzugefügten Komponenten entsprechend dem verfügbaren Speicherplatz erweitert / verkleinert. Dies bedeutet, dass die bevorzugte Größe jeder Komponente möglicherweise überschrieben wird.
Camickr