グラフィックスを扱う |
プリミティブなテキストを扱うためのサポートは、AWT の Graphics、Font、 FontMetrics の各クラスにわたって存在する。
テキストを描く
テキストを描くコードを作成する場合、まず、Label、TextField、TextArea クラス のようなテキスト指向の Component を使用できないか検討する。 Component が適切でない場合に、Graphics の drawBytes()、 drawChars()、または drawString() メソッドを使用す るようにする。
次に、文字列を スクリーンに描くコード例を示す。
g.drawString("Hello World!", x, y);テキスト描画メソッドでは、 x と y は、テキストの左下 隅の位置を指定する整数であ る。 正確に言うと、y 座標は、ほとんどの文字がその上にくる、テキスト のベースライン を指定する。このベースラインはたとえば "y" などにあ る下に垂れる部分 (デセンダ) のスペースは含んでいない。y の値はテキストの垂直方向のスペースを十分とれる大きさで、かつデセンダ を十分とれる小ささでなければならない。
次の図に、アセンダとデセンダのライン、およびベースラインを示す。 アセンダとデセンダについては、後でもう少し詳しく学習する。
ここで、テキストを描く場所に注意を払わないとどのような結果になるか、簡単なアプレットを使って示す。
一番上の文字列は切り取られているはずである。これは、y 引数が 5であり、この文字列のベースラインの上には 5 ピクセルしかなく、 ほとんどのフォントでスペースが足りないためである。真ん中の文字列は、デフォルトフォントが大きすぎなければ問題なく表示されているはずである。 一番下の文字列は、デセンダのある文字以外は問題なく表示されているはずである。 一番下の文字列のデセンダはすべて切り取られるが、これはこの文字列を表示するコ ードがデセンダ用のスペースを考慮していないからである。 (このアプレットの ソースコードも参照できる。)
注: テキスト描画メソッドの x と y の解釈は形状描画メソッドとは異なる。ある形状 (矩形など) を描く場合、 x と y は左下隅ではなく、その形状の外接長方 形の左上隅を指定するようになっている。
フォントに関する情報を調べる: FontMetrics
前に示した形状描画例は、通常のデフォルトフォ ントより小さいフォントを選択することによって改良できる。 次の例ではこれを実際に行い、さらにフォントの高さが低くなった分のスペースを使って形状を大きくする。以下に示すのは、状況が改善されたアプレットである (コードも参照できる)。
この例は、フォントサイズの詳細を調べる FontMetrics オブジェクトを使用して適 切なフォントを選び出している。 たとえば、次のループ (paint() メソッドにある) は、アプレット ("drawRoundRect()") が表示する最も長い文字列が各形状に割り当てられたスペースの中に納まるようにしている。
boolean textFits = false; Font font = g.getFont(); FontMetrics fontMetrics = g.getFontMetrics(); while (!textFits) { if ((fontMetrics.getHeight() <= maxCharHeight) && (fontMetrics.stringWidth("drawRoundRect()") <= gridWidth)) { textFits = true; } else { g.setFont(font = new Font(font.getName(), font.getStyle(), font.getSize() - 1)); fontMetrics = g.getFontMetrics(); } }上記のコード例は Graphics の getFont()、 setFont()、 getFontMetrics() メソッドを使用して、現在のフォントを調べたり設 定したりするほか、そのフォントに対応する FontMetrics オブジェクトを取り出し ている。また、FontMetrics の getHeight() と getStringWidth() メソッドを通して、フォントの水平方向と垂直方向 のサイズ情報を調べている。
次の図に、FontMetrics オブジェクトがフォントサイズについて提供できる情報の一部を示す。
ここで、フォントの垂直方向のサイズに関する情報を返す FontMetrics のメソッド の一覧を示す。
- getAscent(), getMaxAscent()
- getAscent() メソッドはアセンダラインとベースラインの間のピ クセル数を返す。 一般に、アセンダラインは大文字の典型的な高さを表す。 具体的には、ア セント値とデセント値はフォントのデザイナが選定し、テキストがデザイナの考えた とおりに表示されるように、テキストのよい "色合い"、すなわちインクの濃さを表 すためのものである。アセントは通常、そのフォントのほとんどの文字に十分なスペ ースをもたらすが、大文字の上のアクセント記号の分は除かれていることが多い。 getMaxAscent() メソッドは、このような例外的に背の高い文字も 考慮に入れるものである。
- getDescent(), getMaxDescent()
- getDescent() メソッドは、ベースラインとデセンダラインの間 のピクセル数を返す。 ほとんどのフォントでは、すべての文字の最も低い点がデセンダラインの中に 納まる。 しかし、あらゆる場合に備えて、すべての文字が確実に納まる間隔を得るため に、getMaxDescent() を使用することができる。
- getHeight()
- 通常はテキストのある行のベースラインと次の行のベースラインの間のピクセ ル数を返す。 これには行間隔の分も含まれていることに注意する。
- getLeading()
- テキストのある行と次の行の間に設けられている間隔を (ピクセル単位で) 返 す。 行間隔とは具体的に、テキストのある行のデセンダラインと、次の行のアセンダラインの間の距離のことである。 参考までに、行間隔を指す leading という英単語は LEDDing (レディング) と発音される。
フォントサイズ (Font クラスの getSize() メソッドによって返され る) は抽象的なサイズにすぎないことに注意する。 理論的には、これはアセントとデセントを加えたものに対応するが、実際は、フォン トデザイナは (たとえば) "12 ポイント" のフォントの高さを細かく決めている。 たとえば、12-ポイントの Times フォントはしばしば 12-ポイントの Helvetica フォントよりも低いのである。 一般に、フォントサイズはおよそ 1/72 インチのポイントで測定される。
次のリストに、FontMetrics がフォントの文字の水平方向のサイズに関する情報を返 すために用意しているメソッドを示す。 これらのメソッドは、それぞれの文字の周りのスペーシングも考慮に入れている。 もっと正確に言うと、各メソッドは特定の文字 (群) が使用するピクセル数では なく、その文字 (群) が表示されるときに現在のポイント が横方向 に進むピクセル数を返す。 これは、文字やテキストの幅と区別するため、送り幅 と呼ばれる。
- getMaxAdvance()
- そのフォントで最も横幅の広い文字の送り幅 (ピクセル単位)。
- bytesWidth(byte[], int, int)
- 指定されたバイト配列で表されるテキストの送り幅。 最初の整数引数はバイト配列内でのデータの開始オフセットを指定する。 2 番目の整数引数は、検査するバイトの最大数を指定する。
- charWidth(int), charWidth(char)
- 指定された文字の送り幅。
- charsWidth(char[], int, int)
- 指定された文字配列によって表される文字列の送り幅。
- stringWidth(String)
- 指定された文字列の送り幅。
- getWidths()
- そのフォントの最初の 256 文字のそれぞれの送り幅。
グラフィックスを扱う |