2011-05-14 30 views
8

Lo que quiero decir con un par JLabel-JTextField es un componente JLabel seguido de un JTextField uno, por ejemplo, "Parámetro 1: -----" donde "----- "denota un JTextField en blanco.Cómo alinear pares JLabel-JTextField verticalmente

El problema es que el ancho de JLabels varía debido a la longitud variable de los nombres de los parámetros, por lo que los inicios de JTextFields no están alineados verticalmente.

¿Hay alguna forma de alinear los JLabels verticalmente a su derecha, para que los inicios de JTextFields que siguen estén alineados? Gracias.

+2

Este es un buen caso para [ 'MiGLayout'] (http://www.miglayout.com/), si la dependencia es aceptable. – trashgod

+1

o 'FormLayout' de jgoodies – MeBigFatGuy

Respuesta

6

¿Hay alguna manera de alinear los JLabels verticalmente a su derecho, de manera que las aperturas de JTextFields que siguen se alinearían?

1.6+, GroupLayout. P.EJ. a partir de los JavaDocs:

enter image description here

Utilice la alineación de la etiqueta que empuja el texto en el lado derecho.


Véase también this answer para un MCVE.

0

El LayoutManager del componente principal tiene la responsabilidad de posicionar los elementos contenidos. Tal vez necesite establecer un XYLayout.

Consulte el setLayoutManager() para su clase principal.

+1

-1, XYLayout no es un diseño estándar y los gestores de diseño basados ​​en el posicionamiento absoluto no deberían promoverse ya que no son realmente gestores de diseño. – camickr

6

No especificó qué diseño utiliza, por lo que un buen diseño para implementar sería GridBagLayout. El demo in oracle site es genial para empezar.

Y un breve ejemplo:

JPanel panel = new JPanel(); 
panel.setLayout(new GridBagLayout()); 
GridBagConstraints c = new GridBagConstraints(); 
c.gridx = 0; 
c.gridy = 0; 
panel.add(new JLabel("Label 1:"), c); 
c.gridx = 1; 
c.gridy = 0; 
panel.add(new JTextField("TextField 1"), c); 
c.gridx = 0; 
c.gridy = 1; 
panel.add(new JLabel("Label 2:"), c); 
c.gridx = 1; 
c.gridy = 1; 
panel.add(new JTextField("TextField 2"), c); 
+2

+1, pero pronto se quejarán de que los componentes se agrupan en el medio cuando se cambia el tamaño de la GUI. No olvides el weightx y el peso. :) –

+0

Este enfoque anida muy bien como un 'LabelTextPanel' (que tiene un' GridBagLayout') para cada fila en un 'GridLayout'. – trashgod

1

Yo sugeriría que el gestor de GridLayout diseño. Presenta la solución más sencilla para mostrar la visualización en pares de los controles de etiquetas y cuadros de texto. De este modo, simplemente define el número de filas y columnas en el momento de la creación de instancias y los controles agregados serán manejados por el administrador.

+1

Pero los campos de etiqueta y texto están forzados a ser del mismo tamaño, lo que generalmente da como resultado una GUI muy fea. Aconsejo no usar esto. –

+1

@Hovercraft es correcto, aunque esto puede funcionar si las etiquetas y los campos son de un tamaño comparable y cuando se usan con @ mKorbel's [respuesta] (http://stackoverflow.com/questions/6005258/how-to-align-jlabel-jtextfield -pairs-verticalmente/6005330 # 6005330). – trashgod

3

o

no es posible alinear solo texto dentro JTextComponents con

JLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); 
+0

+1 Consulte también este [ejemplo] (http://stackoverflow.com/questions/3174765/variable-layout-in-swing/3175280#3175280). – trashgod

+0

hmmm que era bueno y lo mismo que cómo crear EmptyBorder a 10 píxeles utilizando BorderLayout ... (coloca JComponents en las ubicaciones de CENTER sin ningún tamaño) – mKorbel

1

buenas soluciones para esto que he visto incluyen el uso de la GridBagLayout (como se señaló anteriormente) o el MiGLayout, aunque ya este último no es parte de Java estándar, debe descargarse y colocarse en el classpath antes de su uso. MiGLayout no es tan difícil de usar.

2

Este es un caso de uso perfecto para DesignGridLayout:

DesignGridLayout layout = new DesignGridLayout(contentPane); 
layout.labelAlignment(LabelAlignment.RIGHT); 
layout.row().grid(label1).add(field1); 
layout.row().grid(label2).add(field2); 
... 
+0

Incluye una buena demostración de JWS. – trashgod

+0

No es parte de la biblioteca estándar – Murmel

+0

@ user1885518 OP no mencionó que tenía que ser parte de la biblioteca estándar. – jfpoilpret

Cuestiones relacionadas