ejemplos java swing jlabel sizing

java - ejemplos - jpanel



averiguar si el texto de JLabel excede el tamaƱo de la etiqueta (6)

De Oracle - Texto de medición :

// 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 el size con el tamaño de JLabel.getSize() ;

En Java, cuando el texto de JLabel no pudo mostrarse debido a la falta de espacio, el texto se trunca y se agrega "..." al final.

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

EDITAR:

Veo que hay una manera de averiguar el tamaño del texto usando FontMetrics . Sin embargo, esta solución no responde completamente a la pregunta. En el caso de que el texto de JLabel contenga decoraciones HTML, metrics.stringWidth() también calcularía el ancho de las etiquetas HTML. Así que podría suceder que el resultado de metrics.stringWidth() fuera mayor que el ancho de JLabel pero aún así el texto se mostraría correctamente.

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


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

lengthOfChar * numChars

Si no estás usando una fuente monoespaciada, obviamente es mucho más difícil. Creo que hay algunas utilidades alrededor 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.


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

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


Para obtener tamaños de texto html, verifique 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 problema pequeño es que puede tener problemas con el texto no html. Por lo tanto, solo use métricas de fuentes para cadenas no 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()); }


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


Verifique 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.