2011-08-18 42 views
15
Font font = Font("Arial", Font.BOLD, 35); 

JLabel label = new JLabel("57"); 
JPanel panel = new JPanel(); 
panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS)); 
panel.add(label); 

Esto crea una JLabel con un espacio extra por encima y por debajo. Intenté setVerticalAlignment(SwingConstants.TOP) pero no funciona. De nuevo, no quiero alinear JLabel a la parte superior, pero el texto dentro de JLabel debe estar alineado a la parte superior.La alineación vertical de JLabel no funciona como se esperaba

aquí es cómo mi sello parece enter image description here

+0

olvidé una línea. label.setFont (fuente); – arpanoid

+0

La razón probable de esto es que algunos símbolos se extenderían más allá de los números, y la alineación del texto dentro de la etiqueta, combinada con el tamaño de la etiqueta, debe tener en cuenta varias métricas de fuentes. http://upload.wikimedia.org/wikipedia/commons/3/39/Typography_Line_Terms.svg No es una respuesta a tu pregunta, pero podría ser útil. –

+0

+1 para incluir una imagen; como un lado, no pase por alto el valor de ['RenderingHints'] (http://download.oracle.com/javase/6/docs/api/java/awt/RenderingHints.html). – trashgod

Respuesta

19

El texto de la etiqueta ya está alineado con la parte superior. Incluso si establece los tres de:

label.setVerticalAlignment(JLabel.TOP); 
label.setVerticalTextPosition(JLabel.TOP); 
panel.setAlignmentY(TOP_ALIGNMENT); 

todavía podría encontrar esa brecha.

El problema está relacionado con font-metrics. La fuente deja espacio para los signos diacríticos, y aunque los números en inglés e incluso las letras no contienen signos diacríticos en letras mayúsculas, Arial definitivamente contiene una amplia gama de caracteres internacionales, incluso más altos que una letra mayúscula, por ejemplo, diéresis (ÄÜÜ) o caracteres alemanes que contiene signos diacríticos portugueses (Á?).

Si desea una solución rápida y fácil que sea un truco, que no se adapte bien a fuentes y plataformas, puede usar un valor negativo en un borde para compensar las métricas de fuente. está visualizando

label.setBorder(BorderFactory.createEmptyBorder(-3 /*top*/, 0, 0, 0)); 

Si desea solucionarlo "derecho" debe fijarse en el aprendizaje sobre el paquete FontMetrics, ya que tiene muchas funciones que podrían ser útiles para el cálculo de la altura real y la ubicación del texto, de manera que puedes mover toda la cadena por la cantidad adecuada de píxeles.

+0

+1 ¿Puede comentar sobre la relativa seguridad de esta solución? – trashgod

+0

+1, buen truco. No sabía que podrías usar valores negativos. : D – mre

+0

Gracias ... eso funcionó. Sucio aunque ... – arpanoid

5

La flecha en sus puntos de diagramas para la diferencia entre nominal ascenso del glifo y la máxima de ascenso , como se discutió en FontMetrics. Puede jugar con setBorder(null); pero para un control absoluto, tendrá que representar los glifos usted mismo, como se muestra en here. Afortunadamente, los glifos de dígitos de la mayoría de las fuentes tienen un avance y ascent.

+2

aunque lo haga \t 'FontMetrics fontMetrics = label.getFontMetrics (font); int offset = fontMetrics.getMaxAscent() - fontMetrics.getAscent(); System.out.println (offset); 'utilizando su código de muestra con la fuente establecida en Arial, obtendrá una diferencia de cero. Este es en realidad un error conocido (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6623223) que probablemente no será reparado porque rompe la compatibilidad con versiones anteriores y está marcado con una prioridad tan baja. –

+0

¡Buena referencia, gracias! Actualizado. – trashgod

Cuestiones relacionadas