フォント


フォントを変更する

さて、GUIプログラムともなるとフォントは重要ですね
カラフルでも、小さくて何てことないフォントでは迫力がありません

フォントの情報はjava.awt.Fontクラスにカプセル化されています
まずはこのクラスのインスタンスを生成しましょう。コンストラクタは次のとうりです

public Font( String name, int style, int size )

nameには、直接フォント名を指定します。Serifなどがよく使われます
styleは、フォントの書体の定数を指定します
定数はFontクラスに用意されていてBOLD(太字)ITALIC(斜体)、PLAIN(標準)のいずれかを指定します
これらの定数は、加算して組み合わせることもできます

sizeは、フォントサイズを指定します

こうして生成したFontクラスのインスタンスを、GraphicsクラスのsetFont()メソッドで設定します
ここではじめて、実際に表示されるフォントが設定されます

public abstract void setFont( Font font )

fontに、生成したFontクラスのオブジェクトを渡します
これで、出力されるフォントが先ほど指定したFontオブジェクトのフォントになります
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Font;

/*<applet code="App11.class" width="400" height="200"></applet>*/

public class App11 extends Applet {
        public void paint(Graphics g) {
                setBackground(Color.white);

                g.setFont(new Font("Serif" , Font.BOLD + Font.ITALIC , 30));
                g.drawString("Kitty on your lap" , 50 , 100);
        }
}
アプレット

Fontクラスには、さらにフォントに関する情報を取得するメソッドが用意されています
必要に応じて、リファレンスを引いて使用して下さい


フォントメトリックス

フォントのサイズの正確な情報を得ない限り、文字列のレイアウトは混沌としています
センタリングや改行などには、正確なフォントサイズを知る必要があります

そのような情報を提供するのがjava.awt.FontMetricsクラスです
このクラスを利用することで、文字、文字列の正確なサイズを得ることができます

文字のサイズは大きく分けて三つあります
ベースラインから、文字の上部分までをアセント、下部分までをディセント
上の行のディセントと下の行のアセントの間をレディングといいます
フォントの高さは、アセント+ディセント+レディングになります

アセントの値を得るにはgetAscent()メソッドを
ディセントの値を得るにはgetDescent()メソッドを
レディングの値を得るにはgetLeading()メソッドを
そして、それぞれの合計であるフォントの高さを得るにはgetHeight()メソッドを使用します

public int getAscent()
public int getDescent()
public int getLeading()
public int getHeight()

それぞれのメソッドは目的の値を返してくれます
FontMetricsクラスはabstractクラスです。インスタンスは生成できません

Graphicsクラスには、オブジェクトのフォントメトリックスを返すメソッドが用意されています

public FontMetrics getFontMetrics()
public abstract FontMetrics getFontMetrics( Font f )

引数をなにも指定しなければ、現在設定されているフォントのフォントメトリックスを
Fontオブジェクトを渡した場合は、Fontオブジェクトのフォントメトリックスを返します
import java.applet.Applet;
import java.awt.*;

/*<applet code="App12.class" width="400" height="200"></applet>*/

public class App12 extends Applet {
	public void paint(Graphics g) {
		int asc , des , led , hig;
		g.setFont(new Font("Serif" , Font.PLAIN , 25));
		setBackground(Color.white);

		FontMetrics fo = g.getFontMetrics();
		asc = fo.getAscent();
		des = fo.getDescent();
		led = fo.getLeading();
		hig = fo.getHeight();

		g.drawString("Back To Your True Shape" , 10 , 100);
		if (hig == (asc + des + led))
			g.drawString("CLOW CARD" , 120 , 100 + hig);

		g.setColor(Color.red);
		g.drawLine(0 , 100 , 400 , 100);		//ベースライン
		g.drawLine(0 , 100 - hig , 400 , 100 - hig);	//フォントの高さ
		g.drawLine(0 , 100 - asc , 400 , 100 - asc); 	//アセント
		g.drawLine(0 , 100 + des , 400 , 100 + des); 	//ディセント
		g.drawLine(0 , 100 + des + led , 400 , 100 + des + led); //レディング
	}
}
アプレット

筆者のブラウザのJVMでは、レディングのラインがディセントと重なってしまっています
もしそうであれば、アプレットビューワーで見てください。たぶん確認できます

まず FontMetrics fo = g.getFontMetrics(); でfoにフォントメトリックスを代入します
あとはそれぞれのメソッドで値を得て、それにしたがってラインを引きます

if (hig == (asc + des + led)) でフォントの高さがアセント+ディセント+レディングであることを証明しています
この評価は真となり、drawString()が実行されます

アプレットに引かれているラインは、上からフォントの高さ、アセント、ベースライン、ディセント、レディングです

もうひとつ、多用するであろうメソッドがstringWidth()です
このメソッドは、指定された文字列の幅を返します

public int stringWidth( String str )

strには、幅を計る文字列を指定します
この値を得れば、センタリングなどのレイアウトができますね
import java.applet.Applet;
import java.awt.*;

/*<applet code="App13.class" width="400" height="200"></applet>*/

public class App13 extends Applet {
        public void paint(Graphics g) {
                int strWidth;
                setBackground(Color.white);
                g.setFont(new Font("Serif" , Font.PLAIN , 20));

                FontMetrics fo = g.getFontMetrics();
                strWidth = fo.stringWidth("Kitty on your lap");

                g.drawString("Kitty on your lap" , 200 - strWidth / 2 , 100);
        }
}
アプレット



前のページへ戻る次のページへ