WisdomSoft - for your serial experiences.

3.6 フォント

描画するテキストのフォントを変更します。フォントはシステムに依存するため、Java はシステム非依存の論理フォントも定めています。また、設定されているフォントから、文字の詳細なサイズを取得できます。

3.6.1 Fontクラスとフォント名

Graphics クラスの drawString() メソッドは、Graphics オブジェクトに設定されている現在のフォントを使ってテキストを描画します。表示するテキストのサイズを変更したり、テキストを斜体や太字で表示したい場合はフォントを変更する必要があります。Graphics オブジェクトの現在のフォントを変更するには setFont() メソッドを、現在のフォントを取得するには getFont() メソッドを使います。

Graphics クラス setFont() メソッド
public abstract void setFont(Font font)
Graphics クラス getFont() メソッド
public abstract Font getFont()

フォントは java.awt.Font クラスで表されます。Font クラスはテキストを目に見える形に描画するためのフォントに関する情報をカプセル化しています。

java.awt.Font クラス
java.lang.Object
  |
  +--java.awt.Font
public class Font extends Object implements Serializable

最終的に、テキストは物理デバイスがサポートする物理フォントで描画されますが、Java プラットフォームではこの物理フォントを抽象化しなければなりません。そこで、Java では物理フォントに対して論理フォントを定義しています。論理フォントとは、全ての Java プラットフォームがサポートしなければならないフォントとして定められています。ただし、論理フォントは実際に存在するフォントライブラリではなく、システムが実装している物理フォントに関連付けられています。つまり、同一の論理フォントでも最終的には物理フォントに依存します。

定められている論理フォントは Serif、SansSerif、Monospaced、Dialog、および DialogInput の 5 つです。論理フォントは物理フォントにマッピングされているだけの存在なので、同じ Serif フォントを使っても、システムが異なれば形が異なる可能性があります。

フォントは、このようにフォント名で識別されます。Font() コンストラクタではフォント名を指定するパラメータが宣言されているので、通常は論理フォントのいずれかから選択します。物理デバイスがサポートする物理フォントを指定することもできますが、システムで有効なフォントを検索するなどの処理が必要になります。

Font() クラスのコンストラクタ
public Font(String name, int style, int size)

name パラメータにフォント名を、sytle パラメータには太字や斜体などのフォントスタイルをあらわす定数を指定します。このパラメータに指定できる値は Font クラスのフィールドで定義されている PLAIN、BOLD、ITALIC の組み合わせです。太字でかつ斜体のフォントを生成したい場合は BOLD | ITALIC を指定すれば良いでしょう。最後の size にはフォントサイズをポイント単位で指定します。1 ポイントは 1/72 インチと同じです。

表1は Font クラスのオブジェクトの情報を取得するメソッドです。Font オブジェクトはフォントの名称に関して論理フォント名、フォントフェース名、フォントファミリ名の 3 つの名前を提供します。論理フォント名は Java が定めている論理フォントの名称で、フォントを構築するための名前です。フォントフェースはさらに Bold や Italic なども含めた具体的な特定のフォント名です。フォントファミリ名は、フォントフェースの文字体裁を決定する名称です。論理フォント名 Serif から斜体のフォントを生成したとすれば、フォントファミリは Serif、フォントフェースは Serif Italic となります。

表1 Font クラスのメソッド(抜粋)
メソッド 解説
public String getFamily() フォントファミリ名を返す。
public String getFontName() フォントフェース名を返す。
public String getName() フォントの論理名を返す。
public int getSize() フォントサイズをポイント単位で返す。
public boolean isBold() フォントスタイルが BOLD なら true を返す。
public boolean isItalic() フォントスタイルが ITALIC なら true を返す。
public boolean isPlain() フォントスタイルが PLAIN なら true を返す。

フォントオブジェクトを生成することができれば、Graphics オブジェクトに設定することでテキスト描画処理に使われるフォントを変更することができます。

コード1
import java.applet.Applet;
import java.awt.*;

//<applet code="Test.class" width="400" height= "400"></applet>

public class Test extends Applet {
	public void paint(Graphics g) {
		Font font = new Font("Serif" , Font.ITALIC , 30);
		g.setFont(font);
		g.drawString(font.getFontName() , 0 , font.getSize());
	}
}
実行結果
コード1 実行結果

コード1は、Serif 論理フォント名で新しい Font オブジェクトを生成し、このフォントでテキストを描画しています。Graphics オブジェクトのテキスト描画メソッドは設定されている現在のフォントを用いるため setFont() メソッドを使って新しいフォントを指定します。実行結果を見て確認できるように、テキストがデフォルトのフォントよりも大きく斜体で表示されています。

描画している文字列は Font クラスの getFontName() が返した Font オブジェクトのフォントフェース名です。serif フォントファミリの italic を使っていることが確認できます。

3.6.2 フォントサイズに関する詳細情報

高度なテキスト処理ソフトウェアを開発する場合、フォントの詳細な情報が必要になります。正確にテキストを改行させたり、1 文字ずつテキストを流れるように表示させる処理には、文字のサイズを知る必要があります。そのためには 、フォントの情報だけではなく出力する物理デバイスとの関連を調べなければなりません。特定のデバイスにおける特定のフォントの描画情報を得るには java.awt.FontMetrics クラスを使います。

java.awt.FontMetrics クラス
java.lang.Object
  |
  +--java.awt.FontMetrics
public abstract class FontMetrics extends Object implements Serializable

FontMetrics クラスは抽象クラスなのでコンストラクタからインスタンスを生成することはできません。FontMetrics の実装を提供するには Font オブジェクトと物理デバイスの情報が必要になります。FontMetrics オブジェクトは Component クラスか Graphics クラスのいずれかの getFontMetrics() メソッドから取得します。

.Component クラス getFontMetrics() メソッド
public FontMetrics getFontMetrics(Font font)

これは Component クラスが提供する getFontMetrics() メソッドです。メソッドは font パラメータに指定したフォントの描画情報を提供する FontMetrics オブジェクトを返します。FontMetrics オブジェクトはコンポーネントを描画するデバイスにおけるフォントの描画情報を提供します。

Graphics クラスの getFontMetrics() メソッドはオーバーロードされています。

Graphics クラス getFontMetrics() メソッド
public FontMetrics getFontMetrics()
public abstract FontMetrics getFontMetrics(Font f)

パラメータを受け取らない getFontMetrics() メソッドは、Graphics オブジェクトに設定されている現在のフォントが対象となります。この Graphics オブジェクトが参照している物理デバイスで指定したフォントの描画情報が得られます。

FontMetrics クラスが提供する情報でも、特に重要なのはアセントディセントレディングです。アセントとはフォントのベースラインから文字の最上部までの間隔、ディセントはベースラインから文字の最下部までの間隔を表します。レディングはディセントから次の行のアセントまでの間隔です。文字の高さは、アセント、ディセント、レディングの合計値を表します。

表2 FontMetrics クラスのメソッド(抜粋)
メソッド 解説
public int charWidth(char ch) 指定された文字 ch の幅をピクセル単位で返す。
public int stringWidth(String str) 指定された文字列 str の幅をピクセル単位で返す。
public int charsWidth(char[] data, int off, int len) 指定された文字配列 data の幅をピクセル単位で返す。
public int getAscent() フォントのアセントをピクセル単位で返す。
public int getDescent() フォントのディセントをピクセル単位で返す。
public int getLeading() フォントのレディングをピクセル単位で返す。
public int getHeight() フォントのテキスト 1 行の標準の高さをピクセル単位で返す。
public Font getFont() この FontMetrics の Font オブジェクトを返す。

表2は FontMetrics クラスの主なメソッドです。例えば getHeight() メソッドを使うことでテキストを現在のフォントで適切に改行することができますし、文字や文字列をデバイスに表示したときの幅を stringWidth() メソッドから得ることができます。1 文字ごとに順番に描画する演出などを行うには必要になるでしょう。

コード2
import java.applet.Applet;
import java.awt.*;

//<applet code="Test.class" width="400" height= "400"></applet>

public class Test extends Applet {
	private static final String TEXT = "Kitty on your lap";

	public void paint(Graphics g) {
		Font font = new Font("Serif" , Font.PLAIN , 50);
		FontMetrics fm = g.getFontMetrics(font);
		int ascent = fm.getAscent();
		int descent = fm.getDescent();
		int leading = fm.getLeading();
		int height = fm.getHeight();
		int width = fm.stringWidth(TEXT);

		g.setFont(font);
		g.drawString(TEXT , 0 , ascent);

		g.setFont(new Font("Serif" , Font.ITALIC , 20));
		fm = g.getFontMetrics();
		g.drawString(
			"ascent=" + ascent + ",descent=" + descent +
			",leading=" + leading + ",height=" + height ,
			0 , height + fm.getAscent()
		);

		g.setColor(Color.RED);
		g.drawLine(0 , ascent , width , ascent);

		g.setColor(Color.GREEN);
		g.drawLine(0 , ascent + descent , width , ascent + descent);

		g.setColor(Color.BLUE);
		g.drawLine(0 , ascent + descent + leading , width , ascent + descent + leading);
	}
}
実行結果
コード2 実行結果

コード2は 50 ポイントの大きなフォントを設定し、このフォントの詳細情報を表す FontMetrics オブジェクトを Graphics クラスの getFontMetrics() メソッドから取得しています。FontMetrics オブジェクトからは、フォントのアセント、ディセント、レディング、及び Test クラスの TEXT フィールドが表す文字列をこのフォントで描画したときの幅を取得しています。

実行結果を見て確認できるように、プログラムでは drawLine() メソッドを使ってフォントのアセント、ディセント、レディングの位置を線で描画しています。赤いラインがアセント(ベースライン)、緑のラインがディセント、青いラインがレディングです。具体的な数値は下部に描画した斜体のテキストが表しています。アセント、ディセント、レディングの合計値がフォントの高さを同じであることを証明しています。