2011-11-01 15 views
14

En Java, cuando el texto de JLabel no se pudo mostrar debido a la falta de espacio, el texto se trunca y se agrega "..." al final.averiguar si el texto de JLabel supera el tamaño de etiqueta

¿Cómo puedo saber fácilmente si actualmente JLabel muestra el texto completo o el truncado?


EDIT:

veo que hay una manera de averiguar el tamaño del texto mediante el uso de FontMetrics. Sin embargo, esta solución no responde completamente la pregunta. En el caso de que el texto de JLabel contenga decoraciones HTML, el metrics.stringWidth() también calcularía el ancho de las etiquetas HTML. Por lo tanto, podría suceder que el resultado de metrics.stringWidth() fuera más grande que el ancho de JLabel, pero el texto se mostraría correctamente.

¿Hay alguna manera de saber qué decisión tomó el propio JLabel mientras se muestra el texto? ¿Ha decidido truncar el texto o no?

Respuesta

8

Los puntos suspensivos se añade por de la etiqueta delegado interfaz de usuario, típicamente una subclase de BasicLabelUI, como parte de su diseño y el cálculo del tamaño preferido. El método layoutCL() se puede anular para examinar la geometría, como se muestra en este example.

Como una cuestión práctica, ignoraría la elisión y mostraría el texto completo en una información sobre herramientas.

+2

'muestra el texto completo en una información sobre herramientas. Eso es casi lo que intento hacer. Si el texto está truncado para mostrar el texto completo en la información sobre herramientas. – jutky

+1

Muchas gracias. Esta es una solución muy elegante. – jutky

+1

Buena llamada en la información sobre herramientas, ahora estoy usando eso. –

5

De Oracle - Measuring Text:

// get metrics from the graphics 
FontMetrics metrics = graphics.getFontMetrics(font); 
// get the height of a line of text in this font and render context 
int hgt = metrics.getHeight(); 
// get the advance of my text in this font and render context 
int adv = metrics.stringWidth(text); 
// calculate the size of a box to hold the text with some padding. 
Dimension size = new Dimension(adv+2, hgt+2); 

Compare size al tamaño de la JLabel.getSize();

+0

¿Y si quiero asegurarme de que la etiqueta muestre todo el texto (sin tronco)? ¿Cómo puedo garantizar que sin establecer explícitamente el tamaño de JLabel con setXXXSize? – Heisenbug

+0

Me parece imposible. Trivialmente, si tiene una etiqueta que tiene 10 px de ancho y el texto es la obra completa de Shakespeare, habrá algunos truncamientos a menos que cambie el tamaño de JLabel. – Kane

+0

@Heisenburg: Calcula el tamaño del texto tal como se describe Oracle, luego usa el método setPreferredSize para establecer JLabel. Tendrás que encontrar las constantes de relleno apropiadas en la 4ª línea para un JLabel. –

1

La forma habitual de hacerlo es utilizar un método que calcule el tamaño esperado del texto tal como se mostrará en la etiqueta. Si está utilizando una fuente de espacio fijo, esto es fácil:

lengthOfChar * numChars 

Si usted no está utilizando una fuente de espacio fijo, obviamente es mucho más difícil. Creo que hay algunas utilidades que intentarán calcular esto.

Una vez que tenga el tamaño de la cadena mostrada, puede compararla con la longitud de JLabel y ver si la etiqueta es demasiado pequeña.

4

Supongo que si el tamaño preferido del componente es mayor que su tamaño real, entonces puede esperar el truncamiento. Para que esto funcione, por supuesto, el componente ya debe ser realizado.

+1

No estoy seguro. Si configuro el tamaño preferido que es más grande que el necesario para mostrar el texto en su totalidad, podría ser que el tamaño real no sea el preferido, pero el texto no se trunca. – jutky

+0

@jutky, no se recomienda establecer explícitamente el tamaño preferido. Eso es algo que debe dejarle al administrador de diseño. – mre

+0

Entonces, ¿cómo debo vincular el tamaño de los componentes? Enseñé que este es el tamaño preferido para. – jutky

3

Compruebe this y vea el método layoutCompoundLabel(). Devuelve una cadena que representa el texto de la etiqueta. Puede compararlo con el original para determinar si se recortará.

Jim S.

+0

Se ve bien, pero ¿de dónde obtengo los valores para las variables viewR, iconR, textR? – jutky

+0

Pasé en label.getBounds() para los tres y parecía funcionar correctamente. –

0

Para obtener tamaños de texto html marque este https://www.java.net/node/665691.

View view = (View) javax.swing.plaf.basic.BasicHTML.createHTMLView(label, value.toString()); 
int width = (int) view.getPreferredSpan(View.X_AXIS); 
int height = (int) view.getPreferredSpan(View.Y_AXIS); 

El único pequeño problema es que podría tener problemas con el texto no HTML. Por lo tanto, solo use métricas de fuentes para cadenas que no sean html.Lo siguiente funcionó perfectamente para mí:

if (value.toString().startsWith("<html>")) { 
    View view = (View) javax.swing.plaf.basic.BasicHTML.createHTMLView(label, value.toString()); 
    width = (int) view.getPreferredSpan(View.X_AXIS); 
} 
else { 
    width = (int) label.getFontMetrics(label.getFont()).stringWidth(value.toString()); 
} 
Cuestiones relacionadas