2

同じフィールドで異なるフォントサイズのペイントメソッド(フィールドを使用して拡張)でテキストを取得するにはどうすればよいですか??

4

1 に答える 1

4

オーバーライドされたメソッド内でフォント サイズを変更してこれを本当に実行したい場合は、次のpaint()ようなものを使用できます。

   public TextScreen() {
      super(MainScreen.VERTICAL_SCROLL | MainScreen.VERTICAL_SCROLLBAR);

      final int MAX_FONT_SIZE = 24;
      // this is the font style to use, but the SIZE will only apply to the 
      //  beginning of the text
      Font f = Font.getDefault().derive(MAX_FONT_SIZE);

      TextField text = new TextField(Field.NON_FOCUSABLE) {
         public void paint(Graphics g) {
            char[] content = getText().toCharArray();

            Font oldFont = g.getFont();
            int size = MAX_FONT_SIZE;
            // use the baseline for the largest font size as the baseline
            //  for all text that we draw
            int y = oldFont.getBaseline();
            int x = 0;
            int i = 0;
            while (i < content.length) {
               // draw chunks of up to 3 chars at a time
               int length = Math.min(3, content.length - i);
               Font font = oldFont.derive(Font.PLAIN, size--);
               g.setFont(font);

               g.drawText(content, i, length, x, y, DrawStyle.BASELINE, -1);

               // skip forward by the width of this text chunk, and increase char index
               x += font.getAdvance(content, i, length);
               i += length;
            }
            // reset the graphics object to where it was
            g.setFont(oldFont);
         }                     
      };

      text.setFont(f);
      text.setText("Hello, BlackBerry font test application!");

      add(text);
   }

NON_FOCUSABLEこのようにフォントを変更してフィールドをだますpaint()と、青いカーソルが下のテキストと一致しなくなるため、フィールドを作成する必要があったことに注意してください。drawFocus()オーバーライドして何もしないことで、カーソルを削除することもできます。

フォーカス要件が指定されていないため、何が必要かわかりませんでした。

他の代替案を検討する場合は、RichTextFieldが同じフィールド内でフォント サイズ (または他のテキスト プロパティ) を変更できるようにするのに適していると思います。私の例のように、テキストを徐々に縮小することだけが必要な場合、このpaint()実装はおそらく問題ありません。フィールド内の特定の単語を選択して大きなフォントで描画する場合 (HTML<span>タグを使用する場合など) は、おそらくRichTextFieldが最適な方法です。

サンプルコードの出力は次のとおりです。

ここに画像の説明を入力

于 2013-02-09T22:41:41.593 に答える