2012-05-10 29 views
5

Tôi đang viết mã chống lại Java Personal Basis Profile trong J2ME. Tôi cần đo chiều rộng của một pixel là AttributedString.Đo chiều rộng của một AttributedString trong J2ME

Trong Java SE, tôi nhận được một AttributedCharacterIterator từ AttributedString tôi và vượt qua nó để FontMetrics #getStringBounds, nhưng trong J2ME PBP, FontMetrics không có một phương pháp getStringBounds, hoặc bất kỳ phương pháp khác mà chấp nhận một CharacterIterator.

Tôi phải làm gì?

+0

Tôi nên thêm: những gì tôi thực sự cần làm là bọc AttributedString thành các dòng. Điều đó sẽ dễ dàng hơn nhiều với một LineBreakMeasurer, mà tôi cũng không có trong J2ME PBP. :-( –

+0

Thành phần nào sử dụng để hiển thị giao diện người dùng? Giao diện người dùng Canvas hoặc LCD (Biểu mẫu, Cảnh báo, Danh sách ...)? Bạn có thể đính kèm ảnh để hiểu rõ hơn không? –

Trả lời

0

Bạn có thể tìm chiều rộng của văn bản tính bằng pixel.

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

Bây giờ, bạn sẽ có chiều rộng của văn bản bằng pixel trong biến widthOfText;

+0

Điều đó sẽ không cung cấp cho bạn chiều rộng của một AttributedString, trong đó một phần của chuỗi in đậm/nghiêng, đó là câu hỏi của tôi. (Các ký tự in đậm/nghiêng thường rộng hơn các ký tự bình thường của chúng.) –

2

Tôi đã gặp khó khăn thực sự với điều này. Tôi cần phải thay đổi kích thước một bảng điều khiển với chiều rộng của một AttributedString. Giải pháp của tôi là:

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

Nó sử dụng LineBreakMeasurer để tìm một TextLayout cho chuỗi, và sau đó chỉ cần kiểm tra với các TextLayout. (Chiều rộng gói được đặt thành Integer.MAX_VALUE, vì vậy văn bản rộng hơn so với văn bản sẽ bị cắt).

Các vấn đề liên quan