物理フォントの一覧を取得する

広告

次に物理フォントを使ってフォントを設定してみます。論理フォントのページでも記述しましたが物理フォントを使う場合には環境によって指定した物理フォントが無い場合がありますので注意して下さい。

実際に物理フォントを使う前に利用する環境にどんな物理フォントがインストールされているかを確認してみます。

物理フォントにはフォントは同じであっても太さや斜体などの種類毎にそれぞれ異なるフォント名が存在します。例えば「Arial」「Arial Bold」「Arial Italic」「Arial Bold Italic」のようにです。それに対してフォントファミリー名と言うのは種類だけが異なる同じフォントをの総称で例えば先ほどの例で言えば「Arial」がフォントファミリー名となります。

ローカル環境にあるフォント名及びフォントファミリー名はjava.awt.GraphicsEnvironmentクラスのメソッドを使って取得することが出来ます。(GraphicsEnvironmentクラスの細かい使い方はここでは省略します)。

フォント名を取得する

フォント名を取得するにはGraphicsEnvironmentクラスで用意されている「getAllFonts」メソッドを使います。

この GraphicsEnvironment で利用可能なすべてのフォントについて 1 ポイントのサイズのインスタ
ンスを保持している配列を返します。通常の使い方では、ユーザーは特定のフォントを選択できます。
アプリケーションは選択済みインスタンスに deriveFont メソッドを呼び出して、フォントのサイズ
変更と、各種フォント属性の設定を行うことができます。

このメソッドはアプリケーションに、Font インスタンスを使用してテキストを描画するもっとも的
確な制御を提供します。この GraphicsEnvironment のフォントが複数のプログラム可能なバリエー
ションを持つ場合には、その Font の 1 つのインスタンスだけが配列で返され、ほかのバリエーシ
ョンはアプリケーションによって引き出されなければなりません。

この環境のフォントがマルチプルマスターフォントのように複数のプログラム可能なバリエーション
を持つ場合には、そのフォントの 1 つのインスタンスだけが Font 配列で返され、ほかのバリエー
ションはアプリケーションによって引き出されなければなりません。

戻り値:
  Font オブジェクトの配列

戻り値としてローカル環境にインストールされているフォントの一覧をフォントクラスのオブジェクトの配列として取得します。

Fontクラスのオブジェクトとして取得するためフォント名を文字列として取得するにはFontクラスで用意されている「getName」メソッドを使います。

この Font の論理名を返します。getFamily を使用すると、フォントのファミリ名を取得できます。
フォントフェース名の取得には getFontName を使用します。

戻り値:
  この Font の 論理名を表す String

実際の使い方は次のようになります。

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
Font fonts[] = ge.getAllFonts();
String fontName = fonts[0].getName();

フォントファミリー名を取得する

フォントファミリー名を取得するにはGraphicsEnvironmentクラスで用意されている「getAvailableFontFamilyNames」メソッドを使います。

Locale.getDefault() によって返されたデフォルトロケールにローカライズされた、この 
GraphicsEnvironment のすべてのフォントファミリの名前を格納している配列を返します。

一般的な使い方では、ユーザーが特定のファミリ名を選択できるようにします。アプリケーションで
フォントの作成時に、Bold や Italic などのスタイルとともにこの名前を指定できるため、フォン
トシステムに、同じフォントファミリの複数のフォントの中でもっとも適切なものを選択する柔軟性
を与えます。

戻り値:
  デフォルトロケールにローカライズされたフォントファミリ名を を格納する String の配列、ま
    たはこのロケールの 名前が存在しない場合は適切な代替名

戻り値としてローカル環境にインストールされているフォントファミリー名の一覧をString型の配列として取得します。

実際の使い方は次のようになります。

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
String fontfamilys[] = ge.getAvailableFontFamilyNames();

サンプルプログラム

では実際に試してみましょう。今回はフォント名及びフォントファミリー名をそれぞれ取得して表示してみます。

JFontTest2.java

import javax.swing.*;
import java.awt.Font;
import java.awt.BorderLayout;
import java.awt.GraphicsEnvironment;
import java.awt.Dimension;
import java.util.Vector;

public class JFontTest2 extends JFrame{

  public static void main(String[] args){
    JFontTest2 frame = new JFontTest2();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 450, 300);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }

  JFontTest2(){
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();

    Font fonts[] = ge.getAllFonts();
    Vector<String> fontNames = new Vector<String>();

    for (int i = 0; i < fonts.length; i++ ){
      fontNames.addElement(fonts[i].getName());
    }
    JList fontList = new JList(fontNames);

    JScrollPane scrollPane1 = new JScrollPane();
    scrollPane1.getViewport().setView(fontList);
    scrollPane1.setPreferredSize(new Dimension(200, 250));

    JPanel p1 = new JPanel();
    p1.add(scrollPane1);

    String fontFamilyNames[] = ge.getAvailableFontFamilyNames();
    JList fontFamilyList = new JList(fontFamilyNames);

    JScrollPane scrollPane2 = new JScrollPane();
    scrollPane2.getViewport().setView(fontFamilyList);
    scrollPane2.setPreferredSize(new Dimension(200, 250));

    JPanel p2 = new JPanel();
    p2.add(scrollPane2);

    getContentPane().add(p1, BorderLayout.LINE_START);
    getContentPane().add(p2, BorderLayout.LINE_END);
  }
}

上記をコンパイルした後で実行すると次のように表示されます。

物理フォントの一覧を取得する

左側がフォント名の一覧、右側がフォントファミリー名の一覧です。

( Written by Tatsuo Ikura )