Graphicsクラスを使う


さて、paintComponentです。これは、引数に「Graphics」というクラスのインスタンスが渡されます。このGraphicsは、java.awtパッケージに用意されているもので、グラフィックの描画に関する情報の保持と描画関係の機能の提供を行います。一般に「グラフィック・コンテキスト」と呼ばれる部品に相当するもので、このGraphicsに用意されているメソッドをいかに使いこなしていくか、がグラフィック作成のポイントといってよいでしょう。

  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    int w = this.getWidth();
    int h = this.getHeight();
    g.setColor(Color.RED);
    g.fillOval(0, 0, w, h * 2);
    g.setColor(Color.BLUE);
    g.setFont(new Font("Serif", Font.BOLD, 36));
    g.drawString("Let's Swing!", 10, h - 50);
  }


これが、今回のpaintComponentですね。ここでは、ごく大雑把にいえば「色の設定」と「描画メソッドの呼び出し」を中心に処理を行っています。では、メソッドの内容について簡単に整理しておきましょう。

1.スーパークラスの処理を呼び出す
最初に、非常に重要な処理を行っています。メソッドの一番最初にある「super.paintComponent(g);」というものです。これは、スーパークラスのpaintComponentを呼び出すものです。これにより、スーパークラスに用意されているpaintComponentが呼び出され、コンポーネントに必要な描画などが行われます。

ここでは、JPanelという何も表示されないコンポーネントをベースに使っていますから表示上の変化はありませんが、他のコンポーネントなどは、既にコンポーネント自身に何らかの描画が用意されているのがほとんどです。そうしたコンポーネントの描画をきちんと行う上で、super.paintComponentは重要なのです。先にいったように「他の描画処理に極力影響を与えないようにする」というのが、描画処理では大切なのですね。

2.色の設定
Graphicsには、「描画に使う色」に関する情報が保持されています。グラフィックを描画するメソッドを実行する際には、この情報を用いて色が設定されます。ですから、図形を描く前には、まず描画色を設定する必要があります。これは、以下のようにして行います。

[Graphics].setColor ( [Color] );


Graphicsの「setColor」を呼び出すことで、描画色を変更できます。色の値は、java.awt.Colorクラスのインスタンスを指定します。このColorクラスは、newでRGBを細かく指定して色を作ることもできますし、よく使われる色についてはあらかじめクラスに用意されているフィールドを利用することも可能です。

ここでは、setColorの引数に「Color.RED」「Color.BLUE」といった値が使われていますね。この「RED」や「BLUE」は、「赤」「青」を示すColorのクラスフィールドなのです。こうすれば、簡単に赤や青の色を指定できるのですね。

3.図形の描画
図形の描画は、描く図形の形状ごとにいくつものメソッドがGraphicsに用意されています。今回、paintComponentで使っているのは以下の2つです。

[Graphics].fillOval ( 横位置, 縦位置, 横幅, 縦幅 );
[Graphics.drawString ( [String], 横位置, 縦位置 );


「fillOval」は、内部を塗りつぶした楕円を描画するものです。描画する楕円の位置と大きさを引数で指定します。「drawString」はテキストを描画するもので、描画するStringとその位置をそれぞれ指定します。このように、あらかじめGraphicsに用意されているメソッドを呼び出せば、その場で図形がコンポーネント上に描かれるのですね。

4.フォントの設定
ここではdrawStringでテキストを描画していますが、このテキストで使用されるフォントは、Graphicsの「setFont」というメソッドで設定されます。Colorと同じように、Graphicsには「drawStringで使用するフォント」の情報を保管しているのですね。このsetFontは、java.awt.Fontクラスのインスタンスを使ってフォントを指定します。これは、以下のようにしてインスタンスを作成します。

new Font ( フォント名, スタイル値, サイズ );


フォント名は、現実のフォント名を指定することも可能ですが、Javaは特定の環境(OSなど)に影響されないプログラムですから、例えば「MS明朝」のようなWindows用のフォント名を使うのはよくありません。そこで「論理フォント」という、Java仮想マシンに用意されているフォント名が使われます。ここで設定している「Serif」などが論理フォントです。これは、このプログラムが実行される環境にあるフォントから、その論理フォントにもっとも近いものが自動的に選択され使用されるようになっています。これにより、どのような環境でも、だいたい同じようなフォントが使われるようになるわけです。

スタイルは、Fontクラスに用意されている「PLAIN」「BOLD」「ITALIC」といったクラスフィールドを指定します。またサイズは、ポイント換算したint値で指定をします。

――いかがですか。だいたい、paintComponentで行っていたことがわかってきましたか。「ColorやFontといった、描画に使われる設定を行う」「描画のメソッドを呼び出す」――この2つのことさえ頭に入っていれば、簡単な描画は行えるようになります。意外に簡単ですね!