Fontを指定する


Fontクラスを使ってFontの種類、大きさの指定が可能です。
Fontオブジェクトは生成された後にstyle、sizeを変更できません。new演算子で新たに生成するか、derive() methodでコピーし、新たに生成します。


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

class  ExamFont    {
    public  static  void  main(String  args[])  {
        JFrame  jf    =  new  JFrame("Font  test");
        jf.addWindowListener(new  WindowAdapter() {
            public  void  windowClosing(WindowEvent  we)  {
                 System.exit(0);
            }
        });
        ExamFont  ef  =  new  ExamFont();
        ExamFont.FontPanel  fp   =  ef.new  FontPanel();                         //inner class
        jf.getContentPane().add(fp);
  
        jf.setBounds(20,50,300,500);
        jf.setVisible(true);
    }
    class  FontPanel  extends JPanel  {
        public  void  paint(Graphics g)  {
            Font  f1  =  new Font("Serif", Font.PLAIN,18);
            g.setFont(f1);
            g.drawString("Serif,   PLAIN,  18", 10, 20);

            Font  f2  =  new Font("Serif",Font.BOLD ,18);
            g.setFont(f2);
            g.drawString("Serif,   BOLD,  18", 10, 40);

            Font  f3  =  new Font("Serif",Font.ITALIC ,18);
            g.setFont(f3);
            g.drawString("Serif,   ITALIC,  18", 10, 60);

            Font  f4  =  new Font("Serif", Font.BOLD | Font.ITALIC ,18);
            g.setFont(f4);
            g.drawString("Serif,   ITALIC-BOLD,  18", 10, 80);

            Font  f5  =  new Font("SansSerif",  Font.PLAIN,18);
            g.setFont(f5);
            g.drawString("SansSerif,   PLAIN,  18", 10, 100);

            Font  f5b  =  new Font("SansSerif",  Font.BOLD,18);
            g.setFont(f5b);
            g.drawString("SansSerif,   BOLD,  18", 10, 120);

            Font  f6  =  new Font("Dialog",  Font.PLAIN,18);
            g.setFont(f6);
            g.drawString("Dialog,   PLAIN,  18", 10, 140);

            Font  f7  =  new Font("DialogInput",  Font.PLAIN,18);
            g.setFont(f7);
            g.drawString("DialogInput,   PLAIN,  18", 10, 160);

            Font  f8  =  new Font("MonoSpaced",  Font.PLAIN,18);
            g.setFont(f8);
            g.drawString("Monospaced,   PLAIN,  18", 10, 180);

            Font  f9  =  new Font("Symbol",  Font.PLAIN,18);
            g.setFont(f9);
            g.drawString("Symbol,   PLAIN,  18", 10, 200);

            Font  f10  =  new Font("MS 明朝",  Font.PLAIN,18);       //not binary compatible
            g.setFont(f10);
            g.drawString("MS明朝,   PLAIN,  18", 10, 220);

            Font  f11  =  new Font("MS ゴシック",  Font.PLAIN,18);
            g.setFont(f11);
            g.drawString("MSゴシック,   PLAIN,  18", 10, 240);
        }
    }
}      
          



実行結果





Fontクラスの作成

引数に論理フォント名、スタイル、大きさを指定し、Fontクラスのオブジェクトを作成する事で、Fontの指定が可能になります。


実行結果4行目のようにスタイルを組み合わせる場合は、スタイル同士で論理和演算を行います。 new Font("Serif", Font.BOLD | Font.ITALIC ,18);

実行結果11行目、”MS明朝”にあるように、
API仕様書には論理フォントを指定してFontオブジェクトを作成すると書かれていますが、
プラットフォーム固有のFont名を記述しても動作するようです。


setFont() method

作成したFontオブジェクトを引数に与えて呼び出せば、後は表示するだけです。
Componentクラスから継承したメソッドですから、画面に長方形で表示される部品は全て
Fontオブジェクトをセットできると言えます。


論理Font名"Symbol"が表示されないのは、ここの実行環境では
該当するFontが無いためか、論理Font名が認められていないのか、
font.propertiesにマッピングが無いためか、よくわかりません。


コンピュータ上で1つの文字を特定する値を文字コードと言います。1つの文字を表示する際の文字の形状をグリフと呼びます。
Fontはグリフの集まりです。
JavaでFontを扱う時には、それぞれのプラットフォームの環境に影響を受けます。

日本語に限らずFontを表示するには、1・Fontが物理的にインストールされている。2・Javaの論理フォントと物理フォントがマッピングされている
必要があります。

上記のサンプルコードをLinux上でコーディング、コンパイルしたバイナリ-コードをMS-Windows上で動かしても、日本語Fontは正しく表示されませんでした。あらためてMS-Windows上でコーディング、コンパイル、実行した結果が上の図です。
想像している原因は、以下の通りです。

Linuxでコーディング、日本語Font名をhardcodingした。
      ↓
コンパイルで、Unicodeになる。
      ↓
MS-Windowsで実行し、MS-Windowsのfont.propertiesを参照する。これは、日本語はSJISでされている。
つまり、論理Font名が日本語の場合、font.propertiesがSJISかで記述されるかEUCで記述されるかの影響を受ける。(あくまで推測)

LinuxのJDK1.2以降で日本語を表示したい場合、JREのfont.propertiesを設定しなければなりません。
利用可能なFontを入手するsample code
Fontに関するSunのページ