2010-09-21 26 views
6

Tenemos un wich JPanel contiene múltiples JPanels Wich contener JComponents (digamos JLabels y JTextboxes)Componentes Swing Align a través de paneles

Dentro de cada uno de los JPanels internos que utilizamos JGoodies diseño con el fin de asegurar la alineación adecuada de todas las etiquetas.

Pero, por supuesto, nos gustaría tener todas las etiquetas alineadas de forma independiente en qué subpanel se encuentran.

¿Cómo podríamos hacer eso, sin reparar el ancho de la columna que contiene las JLabels?

No podemos perder los JPanels ya que tiene que tener fronteras en torno a grupos de componentes

Respuesta

2

El hecho de que el JPanel s tenga bordes, no significa que realmente deba contener sus contenidos aparentes. Establecer los paneles en transparente. Agregue los paneles y los componentes al panel adjunto. Agregue componentes espaciadores para imitar las inserciones de los paneles en el diseño. También deberá desactivar el "dibujo optimizado", o algo similar, para la superposición de componentes.

+2

Hm, eso podría funcionar, pero sospecho que dará lugar a muchos dolores de cabeza en todo tipo de casos de esquina cuando los bordes no coinciden con los componentes que se supone que rodean. –

+0

@Michael ¿Qué quieres decir? ¡Funciona para mi! –

4

No hay manera simple de hacer lo que yo sepa. Sus opciones:

  • Escribir su propio controlador de distribución (o ampliar uno ya existente) con la capacidad de
  • anchos de columna fija
  • decidir que los paneles que están separadas visualmente por las fronteras no necesitan tener sus contenidos alineado después de todo
+0

+1. Estoy de acuerdo con Michael, tienes que sentarte y diseñar el diseño dada su complejidad. – bragboy

+0

Lo he intentado y es increíblemente difícil. El principal problema, hasta donde recuerdo, es el orden en que se llaman los 2 (o más) métodos de diseño de paneles, o incluso el hecho de que uno puede llamarse pero no el otro ... – jfpoilpret

+0

Preferiría recomendamos usar solo un panel y usar algunas "clases de compilador" para agregarle componentes, de modo que pueda volver a utilizar constructores para varios tipos de "grupos de componentes". – jfpoilpret

1

He leído sugerencias sobre el uso de JSeparator en lugar de múltiples JPanels con bordes, si la alineación de widgets es su prioridad.

JSeparator ofrece el efecto visual de agrupar widgets, pero ellos mismos son simplemente otro widget simple que encaja en el mismo JPanel. Lea el tutorial para obtener consejos importantes, como establecer el tamaño preferido. http://download.oracle.com/javase/tutorial/uiswing/components/separator.html

Además, las pautas actuales de Apple sugieren simplemente usar el espacio vacío como un divisor entre agrupaciones, como una alternativa a los bordes y separadores.

6

Recomiendo favorecer diseños planos sobre anidados. En un diseño único, la alineación es fácil. Evite TitledBorders y reemplácelos con separadores con título, separadores o solo espacios en blanco. Eso ayuda a la gran mayoría de editores y formularios.

Pero si desea alinear varios editores o formularios, la técnica anterior falla. JGoodies FormLayout proporciona dos niveles para abordar estos problemas y, en general, para mejorar la coherencia del diseño: 1) límites inferiores para tamaños, 2) variables de diseño.

Con 1) puede describir diseños que garanticen un ancho mínimo en todos los formularios. Por ejemplo, si quiere decir que todas las columnas de etiquetas tienen al menos un ancho de 100px, puede decir "[100px, pref]" para la columna de la etiqueta.

2) va más allá del enfoque 1). Y la motivación es extraer 100px de sus muchas formas. En FormLayout puede configurar variables de diseño, por ejemplo, $ label que configure como "[100px, pref]" o "right: [75dlu, pref]", etc. Si usa la variable de diseño en todos sus editores, estos serán coherente y tiene un único lugar donde puede configurar todas las columnas de etiquetas para todos los editores.

+0

Hola, Karsten, estoy de acuerdo con el diseño plano, pero era un requisito (en ese entonces) tener grupos: -/ No sabía acerca de las variables de diseño. Bueno saber. –

0

Este código de ejemplo puede ayudar a solucionar el problema de alineación:

//c is instance of the content pane 
c.setLayout(gl=new GridLayout(3,0)); 
//jp is a jpanel. I took this panel because there is no alignment 
//setting for a specifiq cell of grid Layout. 
jp.setAlignmentX(CENTER_ALIGNMENT); 
//jl is the jLabel 
jp.add(jl); 
//finally I add that with the frame 
c.add(jp); 

esperanza de que ayudará a resolver su problema.

+0

ehh ... ¿cómo ayudaría eso a alinear _across_ panels? – kleopatra

Cuestiones relacionadas