がんばれ日本、プログラム解説

Since 2003.04.08  

プログラムの説明

まず、各行ごとにざっと説明します。

/*<applet code="net/sys5jp/Sunflag.class"
  codebase="../../"
  width=400 height=280>
</applet>*/
[/*][*/]で囲まれています。
Javaプログラムとしては、コメントとみなされますので、Javaコンパイラは無視します。
appletviewerが、ここの部分は使います。
package net.sys5jp;
ユーザーの作ったクラス(プログラム)の有り場所を、基準の位置から示します。
import java.applet.*;
このプログラムで参照しているクラス(プログラム)を指定しています。
ここでは、Javaプラットフォームにある「java.applet」パッケージの、「*」(すべて)のクラスを使うと宣言しています。
実際には、java.appletパッケージには、Appletクラスしかありません。
import java.awt.*;
java.awtパッケージのすべてのクラスを使うと宣言しています。
このパッケージはjava.appletとは対照的に88ものクラスが含まれます。
使っているのは、Dimension、Color、Graphics の3つです。
public class Sunflag extends Applet {
クラス名(プログラム名)を決めています。
extends で雛形になるクラス(ここではApplet)を指定します。
これで、任意の大きさのパネル領域が確保されるなど、アプレットとして共通的に必要となる機能が、用意されます。
  public void paint(Graphics g) {
Appletで描画(文字の表示も描画です(draw))を実行するメソッドです
上位のプログラム(Webブラウザやappletviewer)から描画要求されると、この関数が実行されるような仕組みがセットされています。描画のためのGraphicsクラスもセットされています
この中に、描画したい内容を書けばよいことになります。
    Dimension dim = this.getSize();
Dimension というのは、Applet のような画面に表示する機能を持ったクラスの、幅と高さだけを「カプセル化」したクラスです。
日章を描くために、幅が必要なので呼び出します。
this.」はこのクラス(Sunflag)を示します。後の説明のために入れてありますが、省略可能です。
    int x = dim.width * 28 / 100;
    int y = dim.width * 14 / 100;
日章の円に正接する正方形の左上座標を計算します。
    int dist = dim.width * 42 / 100;
日章の円の直径(正接する正方形の辺の長さ)を計算します。
    g.setColor(new Color(255, 255, 255));
白地の描画色を設定します。
    g.fillRect(0, 0, dim.width, dim.height);
全範囲を白で塗りつぶします。
    g.setColor(new Color(255, 0, 0));
日章の描画色を赤に設定します。
    g.fillOval(x, y, dist, dist);
日章の楕円(円は楕円の特殊型ですね)を描きます。
  }
paint メソッドの終わりを示します。
  public void init() {
Appletを開始したときに実行されるメソッドです。
このプログラムでは、開始時に必要な処理はないので、中身は空です。
  }
init メソッドの終わりを示します。
}
Sunflag クラスの終わりを示します。

Java でプログラムを書くときの手順

  1. 書こうとしているプログラム、機能に近い雛形を探す。
    あまり近いものが無い場合には、中間の雛形を作る。
  2. そのプログラムに固有の内容・機能を書き加える。

このようなプログラムの作り方を「差分プログラミング」といいます。
ここで取り組んでいるアプレットの場合には、「Applet」クラスを雛形に使えば、アプレットとしての基本的な振る舞いの部分は、1行もプログラムを書かなくて済みます。
矩形や円といった図形を描画する場合は、「Graphics」クラスを使えば、「矩形を描く」「円を描く」と命令するだけで、「矩形の描き方」についてはプログラムする必要はありません。
Javaではこの方法を広範囲に適用できるように、多くのものが、Javaプラットフォームパッケージとして用意されています。
この差分プログラミングの方法は何段にも重ねて適用できます。
単純で一般的なクラスから、複雑で特殊なクラスまで、何段かを積み上げることによって、同じコードを何度も書かなくて済みます。

「Sunflag」クラスは、つぎの階層の上で動きます。

6net.sys5jp.Sunflag日章旗を描くアプレット
5java.applet.AppletWeb ページに埋め込まれる機能をもったパネル
4java.awt.Panelほかのパネルなどのさまざまなコンポーネントをレイアウトして貼り付ける
3java.awt.Containerほかの AWT コンポーネント(ボタンなど)を含むことができるコンポーネント
2java.awt.Component画面に表示でき、ユーザと対話できるグラフィカルな表現を持つオブジェクト
1java.lang.Objectクラス階層のルート

シンプルなアプレットですから、Panel や Container の機能は表面上は使っていませんが、「画面に表示でき」「Webページに埋め込む」という機能は生かされています。
このように、他のクラスに機能を付け加えて新しいクラスを積み上げていくのを「継承」と呼びます。

paintメソッド内の文の説明

アプレットにGUIとグラフィックスを付け加えるのは、AWT( Abstract Window Toolkit)と呼ばれる java.awt パッケージと、java.awt.event などのサブパッケージの集合体です。通常の道具はおおむね揃っていますが、無い機能もあります。よく例で挙げられるのが、点を描く機能が無いことです。この対策は、幅1高さ1の四角形を描くことが一般的です。(但し、JavaSDK1.4からはこの機能をもちます)

上の概要でも書いたように、ここでは、Dimension、Color、Graphics の3つのクラスを使っています。

Dimension

コンポーネントの幅と高さのデータが、不用意にプログラムによって書き換えられないよう、間接的な操作を提供します。
Dimension dim = this.getSize();というコードは、アプレットのサイズをプログラムが知る方法の定型句です。

Color

色の設定を提供するクラスです。
JavaSDK1.4では、透明度を指定したり、今ある色より明るい色・暗い色を作るといった機能もあります。
このプログラムでは、シンプルな白色、赤色を設定しています。
Color(255, 255, 255); といった書き方が、最も一般的な色の設定です。
HTMLスタイルシートの色の設定の rgb(255,255,255) と同様に、() の中に順番に、赤緑青の明るさを、0〜255の数値で指定します。

Graphics

コンポーネントに描画する操作メソッドを提供します。
扱えるデータは、文字、図形、イメージです。
このプログラムでは、図形のうち、矩形と楕円を描画しています。

AppletなどとGraphicsの関係
Appletなどの
Container
Graphics

この図のように、Appletのpaintメソッドは、上位プログラム(多分Webブラウザ)から呼び出されたときには、public void paint(Graphics g) のように、描画のためのGraphicsクラスもセットされています。
ちょうど、絵を描こうとして、キャンパスと、絵の具セットが用意されているのと同じ状態です。
絵の具を選んで(setColor)、絵を描きます(fillRect)。
g.fillRect(0, 0, dim.width, dim.height);
g.fillOval(x, y, dist, dist);
() の中は、同じで、左上のX座標、左上のY座標、幅、高さの4つを指定します。
fillOval の楕円、円の描き方は、MicrosoftWindows付属のペイントや、MicrosoftOffice の描画ツールと同じように、正接する矩形を指定して、その中に描くという方法です。
これらを使われたことがあると思いますが、念のため図示しておきます。

なお、ここでは使っていませんが、中を塗りつぶさないdrawRect、drawOvalというメソッドも有ります。

トップヘ 目次ヘ 前ヘ 次ヘ