2009-11-23 13 views

Respuesta

105

La respuesta corta es: esto es complicado.

La respuesta es un poco más largo: utilizar setSize() si el padre de su componente tiene ningún controlador de distribución, y setPreferredSize() y su relacionada setMinimumSize y setMaximumSize si lo hace.

setSize() probablemente no hará nada si el padre del componente está utilizando un administrador de diseño; los lugares que normalmente tendrán un efecto serían en los componentes de nivel superior (JFrames y JWindows) y cosas que están dentro de scrolled panes. También debe llamar al setSize() si tiene componentes dentro de un elemento primario sin un administrador de diseño.

Como regla general, setPreferredSize() debe hacer lo "correcto" si tiene un administrador de diseño; la mayoría de los administradores de diseño trabajan obteniendo los tamaños preferidos (así como mínimo y máximo) de sus componentes, y luego usando setSize() y setLocation() para posicionar esos componentes de acuerdo con las reglas del diseño. Entonces (como un ejemplo) un BorderLayout intentará hacer que los límites de su región "norte" sean iguales al preferred size de su componente norte - pueden terminar siendo más grandes o más pequeños que eso, dependiendo del tamaño del jframe, el tamaño de los otros componentes en el diseño, y así sucesivamente.

+1

Pensé que un componente estaba usando un administrador de diseño por defecto (BorderLayout?), Así que si no configuro explícitamente un administrador de diseño ¿significa eso que debería usar setSize() en lugar de setPreferredSize()? –

+3

Creo que los JPanels usan BorderLayout de manera predeterminada, pero JComponent no tiene un diseño predeterminado. La mayoría de las veces, es mejor configurar un administrador de diseño si va a agregar algo en lugar de usar setSize(). – Sbodd

+8

Mi recomendación es usar siempre un administrador de diseño. SetSize() debería considerarse como algo que llama el administrador de diseño, no algo que usted llama. –

5

setSize se cambie el tamaño del componente al tamaño especificado.

setPreferredSize establece el tamaño preferido. Es posible que el componente no sea de este tamaño en función del tamaño del contenedor en el que se encuentra, o si el usuario modificó el tamaño del componente manualmente.

+0

Puede mostrar un ejemplo completo de setPreferredSize (...). Creo que esto sería útil. –

4

IIRC ...

setSize establece el tamaño del componente.

setPreferredSize establece el tamaño preferido. The Layoutmanager intentará organizar ese espacio para su componente.

Depende de si se está utilizando un controlador de disposición o no ...

+0

y ¿qué ocurre si agrego dos jpanels a un jframe sin especificar explícitamente un administrador de diseño para el jframe? ¿Qué método debo usar para configurar el tamaño de los paneles de protección? –

+3

Los paneles de contenido usan BorderLayout de forma predeterminada (http://java.sun.com/docs/books/tutorial/uiswing/layout/using.html). Entonces, el panel de contenido del JFrame tiene un LayoutManager, así setPreferredSize _should_ work .. – miku

+0

Suena bien, eso significa que debo usar setSize para JFrame y setPreferredSize para los componentes dentro de –

9

setSize() o setBounds() se puede utilizar cuando no se utiliza el 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 métodos setXXXSize() como setPreferredSize() y setMinimumSize() etc.

y asegúrese de que el contenedor del componente utiliza un controlador de distribución que respeta la solicita tamaño.Los administradores FlowLayout, GridBagLayout y SpringLayout utilizan el tamaño preferido del componente (los dos últimos dependiendo de las restricciones que establezca), pero BorderLayout y GridLayout generalmente no. Si especifica nuevas sugerencias de tamaño para un componente que ya está visible, necesita invoque el método de revalidación para asegurarse de que su jerarquía de contención se distribuya de nuevo. Luego invoque el método de repintado.

Cuestiones relacionadas