2012-05-10 12 views
5

Ich schreibe Code gegen das Java Personal Basis Profile in J2ME. Ich muss die Breite eines AttributedString in Pixel messen.Messen Sie die Breite eines attributedString in J2ME

In Java SE, würde ich ein AttributedCharacterIterator von meinem AttributedString bekommen und es zu FontMetrics #getStringBounds passieren, aber in J2ME PBP, Fontmetrics hat keine getStringBounds Methode oder jede andere Methode, die eine CharacterIterator akzeptiert.

Was mache ich?

+0

Ich sollte hinzufügen: Was ich wirklich tun muss, ist den AttributiertenString in Zeilen zu wickeln. Das wäre viel einfacher mit einem LineBreakMeasurer, den ich auch in J2ME PBP nicht habe. :-( –

+0

Welche Komponente verwendet, um die Benutzeroberfläche anzuzeigen? Canvas oder LCD UI (Formular, Alert, Liste ...)? Könnten Sie ein Bild anhängen, um besser zu verstehen? –

Antwort

0

Sie können die Breite des Textes in Pixeln finden.

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

Jetzt werden Sie die Breite des Textes in Pixeln in der Variablen widthOfText haben;

+0

Das wird Ihnen nicht die Breite eines AttributedString, wo ein Teil der Zeichenkette fett/kursiv ist, worum ging es in meiner Frage (Fett-/Kursive Zeichen sind oft breiter als ihre normalen Gegenstücke). –

2

Ich kämpfte wirklich schwer damit. Ich musste ein Panel auf die Breite eines AttributiertenStrings skalieren. Meine Lösung ist:

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(); 
} 

Es nutzt den LineBreakMeasurer ein Textlayout für die Zeichenfolge zu finden, und prüft dann einfach die mit dem Textlayout. (Die Umbruchbreite ist auf Integer.MAX_VALUE eingestellt, so dass Texte, die breiter sind als diese, abgeschnitten werden).

Verwandte Themen