Font と FontMetrics (Swing)

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Test {
	public static void main (String[] args)
	{
		Win win = new Win("Test Window");
	}
}

class Win extends JFrame {
	Win (String name)
	{
					// Frameクラスのコンストラクタ(Windowのタイトルを引き渡す)
		super(name);
					// Windowの大きさ
		setSize(400, 100);
					// パネルの貼り付け
		D_Panel pn = new D_Panel();
		pn.setBackground(new Color(144, 238, 144));
		getContentPane().add(pn);
					// ウィンドウを表示
		setVisible(true);
					// イベントアダプタ
		addWindowListener(new WinEnd());
	}

	/************/
	/* 終了処理 */
	/************/
	class WinEnd extends WindowAdapter
	{
		public void windowClosing(WindowEvent e) {
			System.exit(0);
		}
	}
}

class D_Panel extends JPanel {
	/********/
	/* 描画 */
	/********/
	public void paintComponent (Graphics g)
	{
		super.paintComponent(g);   // 親クラスの描画(必ず必要)
		int x, y;
		String str = new String("昨日東京へ行って来ました");
		String str1;
		Font f1 = new Font("MS 明朝", Font.BOLD, 20);
		Font f2 = new Font("MS 明朝", Font.ITALIC, 12);
		FontMetrics fm1 = g.getFontMetrics(f1);
		FontMetrics fm2 = g.getFontMetrics(f2);
					// 塗りつぶした正方形(左上x,y,幅,高さ)
		g.setColor(Color.white);
		g.fill3DRect(20, 15, 350, 30, true);
					// 文字列(文字列,位置x,y)
		x = 25;
		y = 37;
		g.setFont(f1);
		g.setColor(Color.black);
		str1 = str.substring(0, 2);
		g.drawString(str1, x, y);

		x += fm1.stringWidth(str1);
		g.setFont(f2);
		g.setColor(Color.red);
		str1 = str.substring(2, 5);
		g.drawString(str1, x, y);

		x += fm2.stringWidth(str1);
		g.setFont(f1);
		g.setColor(Color.blue);
		str1 = str.substring(5);
		g.drawString(str1, x, y);
	}
}