2012-05-10 19 views
5

Sto scrivendo il codice contro Java Personal Basis Profile in J2ME. Devo misurare la larghezza di un AttributedString in pixel.Misurare la larghezza di un AttributedString in J2ME

In Java SE, mi piacerebbe ottenere un AttributedCharacterIterator dal mio AttributedString e passarlo al FontMetrics #getStringBounds, ma in J2ME PBP, FontMetrics non ha un metodo getStringBounds, o qualsiasi altro metodo che accetta un CharacterIterator.

Cosa devo fare?

+0

Dovrei aggiungere: quello che devo veramente fare è avvolgere la corda attribuita in linee. Sarebbe molto più semplice con un LineBreakMeasurer, che anch'io non ho in J2ME PBP. :-( –

+0

Quale componente utilizza per visualizzare l'interfaccia utente? UI Canvas o LCD (Form, Alert, List ...)? Puoi allegare un'immagine per capire meglio? –

risposta

0

È possibile trovare la larghezza del testo in pixel.

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

Ora, si avrà la larghezza del testo in pixel nella variabile widthOfText;

+0

Questo non ti darà la larghezza di un AttributedString, dove parte della stringa è in grassetto/corsivo, che è la mia domanda. (I caratteri in grassetto/corsivo sono spesso più ampi delle loro controparti normali). –

2

Ho faticato molto per questo. Avevo bisogno di ridimensionare un pannello alla larghezza di un AttributedString. La mia soluzione è:

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

Esso utilizza il LineBreakMeasurer di trovare un TextLayout per la stringa, e poi semplicemente controlla la con del TextLayout. (La larghezza del wrapping è impostata su Integer.MAX_VALUE, quindi i testi più larghi di quello saranno tagliati).