Java: diferencia entre los métodos setPreferredSize () y setSize () en los componentes

105

¿Cuál es la principal diferencia entre setSize()y setPreferredSize(). A veces usé setSize(), a veces setPreferredSize(), a veces uno hace lo que quiero, a veces el otro.

¿Qué llamada debo usar para JFrames y JPanels?

David Robles
fuente

Respuestas:

116

El uso depende de si el padre del componente tiene un administrador de diseño o no.

  • setSize() - utilizar cuando no existe un administrador de diseño principal;
  • setPreferredSize()(también está relacionado setMinimumSizey setMaximumSize): se usa cuando existe un administrador de diseño principal.

El setSize()método probablemente no hará nada si el padre del componente está usando un administrador de diseño; los lugares esto suele tener un efecto sería en los componentes de nivel superior ( JFrameS y JWindowS) y las cosas que están dentro de los paneles enrollados. También debe llamar setSize()si tiene componentes dentro de un padre sin un administrador de diseño.

Generalmente, setPreferredSize()colocará los componentes como se espera si hay un administrador de diseño presente; la mayoría de los administradores de diseño trabajan obteniendo los tamaños preferidos (así como mínimos y máximos) de sus componentes, luego usan setSize()y setLocation()colocan esos componentes de acuerdo con las reglas del diseño.

Por ejemplo, a BorderLayoutintenta hacer que los límites de su región "norte" sean iguales al tamaño preferido de su componente norte; pueden terminar siendo más grandes o más pequeños que eso, dependiendo del tamaño de JFrame, el tamaño de los otros componentes en el diseño, etc.

Sbodd
fuente
1
Pensé que un componente estaba usando un administrador de diseño de forma predeterminada (¿BorderLayout?), Así que si no configuro explícitamente un administrador de diseño, ¿eso significa que debería usar setSize () en lugar de setPreferredSize ()?
David Robles
3
Creo que los JPanels usan BorderLayout de forma predeterminada, pero JComponent no tiene un diseño predeterminado. La mayoría de las veces, es mejor configurar un administrador de diseño si agregará algo en lugar de usar setSize ().
Sbodd
8
Mi recomendación es usar siempre un administrador de diseño. SetSize () debe considerarse como algo que el administrador de diseño llama, no algo a lo que usted llama.
Kevin Day
8
@Sbodd: los JPanels tienen un FlowLayout por defecto. JFrame.getContentPane () tiene un BorderLayout por defecto.
Nemi
10

setSize()o setBounds()se puede utilizar cuando no se utiliza ningún administrador de diseño.

Sin embargo, si está utilizando un controlador de disposición puede proporcionar pistas para el controlador de distribución utilizando los setXXXSize()métodos como setPreferredSize()y setMinimumSize()etc.

Y asegúrese de que el contenedor del componente utilice un administrador de diseño que respete el tamaño solicitado. El FlowLayout, GridBagLayouty SpringLayoutlos gerentes utilizan el tamaño preferido del componente (estos dos últimos en función de las limitaciones que establezca), pero BorderLayout, y GridLayoutpor lo general se especifican don't.If nuevas sugerencias de tamaño para un componente que ya es visible, es necesario invocar el método en revalidate para asegurarse de que su jerarquía de contención se vuelva a establecer. Luego invoque el método repintado.

Varun
fuente
5

setSize cambiará el tamaño del componente al tamaño especificado.

setPreferredSizeestablece el tamaño preferido. Es posible que el componente no tenga este tamaño dependiendo del tamaño del contenedor en el que se encuentra, o si el usuario redimensionó el componente manualmente.

Cañada
fuente
¿Puede mostrar un ejemplo completo de setPreferredSize (...). Creo que esto sería útil.
Doug Hauf
4

IIRC ...

setSize establece el tamaño del componente.

setPreferredSizeestablece el tamaño preferido. El Layoutmanager intentará organizar esa cantidad de espacio para su componente.

Depende de si estás usando un administrador de diseño o no ...

miku
fuente
y ¿qué pasa si agrego dos jpanels a un jframe sin especificar un administrador de diseño explícitamente para el jframe? ¿Qué método debo utilizar para establecer el tamaño de los jpanels?
David Robles
3
Los paneles de contenido utilizan BorderLayout de forma predeterminada ( java.sun.com/docs/books/tutorial/uiswing/layout/using.html ). Entonces, el panel de contenido de JFrame tiene un LayoutManager, por lo que setPreferredSize debería funcionar ...
miku
Suena bien, eso significa que debería usar setSize para JFrame y setPreferredSize para los componentes internos
David Robles
1
Por lo general, utilizaría frame.pack () para aprovechar el tamaño preferido calculado de todos los componentes secundarios. De lo contrario, si usa frame.setSize () al azar, los componentes agregados al panel de contenido se expandirán / contraerán para adaptarse al espacio disponible, lo que significa que el tamaño preferido de cada componente puede ser anulado.
camickr