JavaにおけるFontクラスとFontMetricsクラスの違いとは?
Javaでテキストを描画する際、FontクラスとFontMetricsクラスはそれぞれ異なる役割を担っています。両者の違いを簡単にまとめると、Fontクラスは画面に表示するフォントを設定し、言語の文字を対応するグリフ(字形)にマッピングするためのものです。一方、FontMetricsクラスはフォントメトリクスオブジェクトを定義し、特定の画面上で特定のフォントをレンダリングする際の情報(文字幅や高さなど)をカプセル化します。
Fontクラスとは
Fontクラスは、Fontオブジェクトのインスタンスを作成するために使用されます。このオブジェクトを使うことで、テキストの描画やラベル、テキストフィールド、ボタンなどのコンポーネントにフォントを設定できます。フォントは名前(name)、スタイル(style)、サイズ(size)の3つの要素によって指定されます。
フォントには「ファミリー名」「論理名」「フェイス名」という3種類の名称が存在します。
- ファミリー名(family name): フォントの一般的な名称です。例:「Courier」など。
- 論理名(logical name): フォントのカテゴリを指定します。例:「Monospaced」など。
- フェイス名(face name): 特定のスタイルを持つ具体的なフォントを指します。例:「Courier Italic」など。
Fontクラスの使用例
import java.awt.*;
import javax.swing.*;
public class FontTest extends JPanel {
public void paint(Graphics g) {
g.setFont(new Font("TimesRoman", Font.BOLD, 15));
g.setColor(Color.blue);
g.drawString("Welcome to Tutorials Point", 10, 20);
}
public static void main(String args[]) {
JFrame test = new JFrame();
test.getContentPane().add(new FontTest());
test.setTitle("Font Test");
test.setSize(350, 275);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
test.setLocationRelativeTo(null);
test.setVisible(true);
}
}
この例では、「TimesRoman」を太字(BOLD)、サイズ15で指定し、青色の文字列を描画しています。
FontMetricsクラスとは
FontMetricsクラスは、特定のFontオブジェクトに関する詳細なパラメータ(文字の幅や高さなどの寸法情報)を返すために使用されます。FontMetricsオブジェクトは、getFontMetrics()メソッドを呼び出すことで生成できます。
このクラスのメソッドを利用すると、Fontオブジェクトの実装に関する詳細情報へアクセス可能になります。特にbytesWidth()、charWidth()、charsWidth()、getWidth()、stringWidth()といったメソッドは、テキストオブジェクトの幅をピクセル単位で求めるために使われます。これらのメソッドは、画面上のテキストの水平位置を正確に決定するために不可欠です。
FontMetricsクラスの使用例
import java.awt.*;
import javax.swing.*;
public class FontMetricsTest extends JPanel {
public void paint(Graphics g) {
String msg = "Tutorials Point";
Font f = new Font("Times New Roman",Font.BOLD|Font.ITALIC, 15);
FontMetrics fm = getFontMetrics(f);
g.setFont(f);
int x =(getSize().width-fm.stringWidth(msg))/2;
System.out.println("x= "+x);
int y = getSize().height/2;
System.out.println("y= "+y);
g.drawString(msg, x, y);
}
public static void main(String args[]){
JFrame test = new JFrame();
test.getContentPane().add(new FontMetricsTest());
test.setTitle("FontMetrics Test");
test.setSize(350, 275);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
test.setLocationRelativeTo(null);
test.setVisible(true);
}
}
この例では、stringWidth()メソッドを使って文字列の実際の幅を取得し、その値をもとにコンポーネントの中央にテキストを配置しています。このようにFontMetricsを活用することで、テキストのセンタリングなど精密なレイアウト制御が可能になります。
まとめ:両者の違い
- Fontクラス: フォントの種類・スタイル・サイズを定義し、文字とグリフを対応付ける役割。
- FontMetricsクラス: 指定されたフォントのレンダリングに関する寸法情報(文字幅、行の高さなど)を提供する役割。
つまり、Fontが「どのフォントで表示するか」を決めるのに対し、FontMetricsは「そのフォントで表示したときの実際の大きさ」を測るためのクラスだと言えます。両者を組み合わせることで、Javaでの正確なテキスト描画が実現できます。
-
JavaのJFrameとJDialogの違いとは?特徴と使い分けを解説
JavaのSwingには、ウィンドウを表示するためのトップレベルコンテナとしてJFrameとJDialogが用意されています。どちらもよく似た役割を持ちますが、動作や用途には重要な違いがあります。この記事では、それぞれの特徴をサンプルコードとともに解説し、最後に使い分けのポイントをまとめます。 JFrameとは フレームに追加されたコンポーネントは「コンテンツ」として扱われ、contentPaneによって管理されます。JFrameにコンポーネントを追加する際は、フレーム本体ではなくcontentPaneに対して追加する必要があります。 JFrameは、タイトル、境界線、(オプションで)メニュ
-
JavaのGridLayoutとGridBagLayoutの違いを徹底解説!特徴と使い分けのポイント
JavaのAWT/Swingには複数のレイアウトマネージャーが用意されていますが、その中でもGridLayoutとGridBagLayoutは、コンポーネントを格子状(グリッド)に配置するという点でよく似ています。しかし、両者には重要な違いがあります。 GridLayoutは、すべてのコンポーネントを矩形のグリッド内に配置し、領域を同じサイズの長方形に分割して、各コンポーネントをそれぞれのセルの中に収めます。一方、GridBagLayoutは柔軟性の高いレイアウトマネージャーであり、コンポーネントのサイズを揃えることなく、縦方向・横方向に整列させて配置できます。各GridBagLayoutオブ