2010-01-21 763 views
5

Al hacer invisibles los componentes individuales de un diseño gestionado por GridBagLayout, la disposición de los componentes restantes en el diseño cambia constantemente. GridBagLayout parece "colapsar" celdas con componentes invisibles, lo que hace que otros componentes cambien de posición. Este es un comportamiento muy molesto, y he estado buscando una forma de evitar que haga eso.GridBagLayout: cómo evitar que se colapsen los componentes invisibles

Un método que he intentado es agregar un separador a la misma celda, con un tamaño fijo igual al tamaño preferido del componente que puede estar oculto, pero si ese tamaño preferido alguna vez cambiara, sería un montón de problemas para mantener el espaciador sincronizado. ¿Hay una manera mejor?

En realidad, no sería tan malo si GridBagLayout ignorara por completo las celdas con componentes invisibles, pero aún tiene en cuenta las inserciones de la celda, así que si tiene un diseño de campos de entrada y usa las inserciones perfectamente colóquelos con espacios regulares entre ellos, luego, ocultando un componente en el medio lo elimina del diseño, pero deja el espacio, lo que generalmente significa que los componentes circundantes fluyen juntos, pero con un feo doble ancho entre ellos ...

+1

Ah viejo Gridbaglayout con sus limitaciones, cómo no te echo de menos (pero voy a seguir este hilo de todos modos;) – Anders

+0

Conozco el GridBagLayout durante años, y todavía a veces puedo pasar grandes cantidades de tiempo buscando las causas el comportamiento de colapso. Intente agregar un componente grande, por ejemplo, una etiqueta con mucho texto. A continuación, cambie el tamaño de su contenedor GridBagLayout'ed a un ancho inferior al tamaño preferido de la etiqueta ... Esto es tan extraño – Timmos

Respuesta

1

Una posibilidad sería utilizar paneles anidados con un CardLayout para ocultar los componentes, en lugar de configurarlos como invisibles. Un CardLayout hace que el panel siempre tenga el tamaño de la "tarjeta" más grande.

Alternativamente, podría intentar usar el nuevo (a partir de Java 6) GroupLayout en lugar de GridBagLayout - es mucho más fácil de usar y casi igual de poderoso.

+0

No he tenido la oportunidad de probar GroupLayout: parece interesante, pero desafortunadamente, la compatibilidad con Java 1.5 se aplica en el proyecto (Es decir, ¿cómo se puede esperar que los usuarios tengan que actualizar sus entornos a un estado de tecnología de MENOS DE 4 AÑOS ?!) –

1

Uso MigLayout

para traer de vuelta la alegría en maquetación ^^.

También utilicé GridBagLayout en el pasado, y es horrible. Hay un montón de código repetitivo, y si agrega un pequeño componente, la disposición probablemente esté atornillada.

Otra alternativa es usar Boxlayout

+0

El código de terceros no es una opción, desafortunadamente, por varias razones, y BoxLayout sí no parece ser capaz de crear los arreglos necesarios (bastante complejos) de los elementos de la interfaz de usuario ... –

8

Qué acerca del uso JPanel (o caja) como marcador de posición?
Ponga un JPanel en cada celda y agregue los componentes a los paneles. Si desactiva el componente, el panel debería estar allí ...

+4

No estoy seguro de por qué esto no tenía ningún voto positivo, era exactamente lo que necesitaba. Solo una cosa: querrás hacer 'containerPanel.setLayout (new GridLayout (1, 1)); 'o algo similar; de lo contrario, el valor predeterminado BorderLayout agregará espacio y pondrá todos sus componentes en unos pocos píxeles. –

+0

Ha probado esto y esta es una gran solución para el horrible comportamiento de colapso. – Timmos

0

IIRC, lo que he hecho en el pasado es colocar el componente en un contenedor (o usar un componente separado) que imita los tamaños del original componente, pero no si es el estado oculto. Póngalo en un método o en una bolsa de fachada a grilla, y su código de diseño puede permanecer limpio y agradable.

+0

Ese es el método que he estado usando (creando struts a través de los métodos ofrecidos por "Box"), pero es torpe y propenso a errores. –

Cuestiones relacionadas