2012-05-10 17 views
5

Estoy escribiendo código en contra de Java Personal Basis Profile en J2ME. Necesito medir el ancho de un AttributedString en píxeles.Mida el ancho de un AttributedString en J2ME

En Java SE, Me obtener una AttributedCharacterIterator de mi AttributedString y pasarlo a FontMetrics #getStringBounds, pero en J2ME PBP, FontMetrics no tiene un método getStringBounds, o cualquier otro método que acepta un CharacterIterator.

¿Qué debo hacer?

+0

Debo agregar: lo que realmente tengo que hacer es ajustar el AttributedString en líneas. Eso sería mucho más fácil con LineBreakMeasurer, que tampoco tengo en J2ME PBP. :-( –

+0

¿Qué componente utiliza para mostrar la interfaz de usuario? Pantalla o interfaz de usuario de la pantalla LCD (formulario, alerta, lista ...)? ¿Podría adjuntar una imagen para comprender mejor? –

Respuesta

0

Usted puede encontrar el ancho del texto en píxeles.

String text = "Hello world"; 
int widthOfText = fontObject.charsWidth(text.toCharArray(), 0, text.length()); 

Ahora, tendrá el ancho de texto en píxeles en la variable widthOfText;

+0

Eso no le dará el ancho de una cadena atribuida, donde parte de la cadena está en negrita/cursiva, de lo que se trataba mi pregunta. (Los caracteres en negrita/cursiva a menudo son más anchos que sus contrapartes normales). –

2

Luché muy duro con esto. Necesitaba cambiar el tamaño de un panel al ancho de un AttributedString. Mi solución es:

double GetWidthOfAttributedString(Graphics2D graphics2D, AttributedString attributedString) { 
    AttributedCharacterIterator characterIterator = attributedString.getIterator(); 
    FontRenderContext fontRenderContext = graphics2D.getFontRenderContext(); 
    LineBreakMeasurer lbm = new LineBreakMeasurer(characterIterator, fontRenderContext); 
    TextLayout textLayout = lbm.nextLayout(Integer.MAX_VALUE); 
    return textLayout.getBounds().getWidth(); 
} 

Utiliza el LineBreakMeasurer encontrar un TextLayout para la cadena, y luego simplemente comprueba el con de la TextLayout. (El ancho de envoltura está establecido en Integer.MAX_VALUE, por lo que los textos más amplios se cortarán).