[目次] [前回] [次回] [重要語索引]

第10週: アプレットとアプリケーション

10. 1 Java プログラムの動かし方
10. 2 アプレットを動かす
10. 3 アプレットを書く
10. 4 アプレットの引数
10. 5 練習問題
10. 6 アプリケーションを動かす
10. 7 練習問題
10. 8 アプリケーションを書く
10. 9 アプリケーションの引数
10.10 標準出力
10.11 練習問題
10.12 宿題
10.13 おまけ

10.1 Java プログラムの動かし方

Java ではプログラムの動かし方は次の2種類に分けられます。

今まで練習で作ってきたのはアプレットの方です。アプレットは html 文書の中から呼び出され、ウェブブラウザにダウンロードされて実行されます。

それに対してアプリケーションは、自分のコンピュータにあるファイルに記憶されていて、java コマンドによって実行されます。

アプレットとアプリケーション

アプリケーションは Java の全機能を使うことができますが、アプレットはファイルの読み書きやネットワーク経由の通信が制限されています。それはなぜかというと、通常の設定ではウェブブラウザはアプレットを自動的に実行するので、どこの馬の骨とも分からないアプレットをついうっかり実行してしまうことがあります。そのアプレットが悪いことができないように、機能が制限してあるのです。
ウェブブラウザによって対応している Java のバージョンに違いがあります。1.2.2 に対応しているブラウザはまだ少ないので、自分で作ったアプレットを公開するときには注意が必要です。詳しくはこちらを見てください。

10.2 アプレットを動かす

ウェブブラウザでアプレットを動かす手順は次のようになります。

  1. アプレット用の Java プログラムを書く。
  2. javac コマンドでコンパイルし、class ファイルを作る。
  3. アプレットを表示する html 文書を書く。
  4. class ファイルと html ファイルを~/public_html の下に置き、ウェブサーバからアクセス可能にする。
  5. ウェブブラウザで html ファイルにアクセスする。

ただしデバッグの時は、いちいち重いブラウザを立ち上げるのは大変なので、指定した html ファイルの中のアプレットだけを表示するappletviewer コマンドを使います。

10.3 アプレットを書く

アプレット用のプログラムを書くときは、次の約束を守ってください。

アプレットのメソッド

アプレットはウェブブラウザの中で動くものなので、自分勝手に動くわけにはいきません。ブラウザは必要に応じてアプレットのメソッドを呼び出し、メソッドの実行が終了したら、ブラウザに戻ります。ブラウザから呼び出されるメソッドには次のようなものがあります。

再描画は、ウィンドウが他のウィンドウに隠されていたのが表に出てきたときなどに必要となりますので、paint はいつ呼び出されるか分かりません。原則として、何回呼び出されても同じ図形を描くようにします。ですから、MovingBall.java のように描画するたびにインスタンス変数の値を変更するのは、実は良くないプログラムです。本当はスレッドを使って更新するのが良いのですが、スレッドはこの授業の範囲外なのでこのようにしてあります。

10.4 アプレットの引数

html 文書の中に applet 要素があると、ブラウザは指定されたアプレットのインスタンスを作り、ウィンドウの中に表示します。複数回 applet 要素があると、複数個のインスタンスを作ってそれぞれ表示しますが、それぞれに引数(パラメータ)を与えて、少し違う動作をさせることができます。

applet 要素にパラメータを書くやり方は情報処理 Ia でやりました。このデータをアプレットが受け取るには、getParameter メソッドを使います。getParameter メソッドは name 属性の文字列を引数とし、対応する value 属性で指定された文字列を返り値とします。例えば、情報処理 Ia のテキストの場合、param 要素に

    <param name="title" value="Keio SFC">
と指定してあります。アプレットのプログラムの中では、
    String s = getParameter("title");
とすると、String 型の変数 s に、"Keio SFC"という値が代入されます。

getParameter メソッドの返り値は String 型ですから、数値をパラメータとする場合は、Integer.parseInt またはDouble.parseDouble で文字列から数値に変換する必要があります。

10.5 練習問題

MovingBall.java を変更して、パラメータによりボールの個数を指定するようにしましょう。
  1. MovingBall.htmlapplet 要素に、param 要素を追加しましょう。name 属性の値は"ball"value 属性の値は適当な個数にしてください。
  2. MovingBall.html にもう一つ applet 要素を追加し、個数だけを変えてください。
  3. MovingBall.java の「ここで自分の作ったインスタンスを覚えておく変数を宣言する。」のところでは、Ball 型の配列を記憶する変数 myBall を宣言します。何個の配列になるかはまだ分からないので、初期値は書きません。
  4. 実際に Ball のインスタンスを作るのは、最初に呼び出されるinit メソッドの中です。「ここでインスタンスを作り、変数に記憶させる。」のところに書きましょう。
    • まず、html 文書の中で指定したボールの個数を読み取ります。getParameter メソッドで "ball" パラメータの値を読み取り、整数に変換して int 型の変数 n に代入します。
    • 次のようにして指定された個数分の配列を作ります。
          myBall = new Ball[n];
      
      この newn 個分の配列を作るためのもので、Ball クラスのインスタンスを作るものではありませんから、注意しましょう。
    • 指定された個数のインスタンスを作り、myBall が記憶している配列の [0] 番から [n-1] 番に代入していきましょう。この時、座標は少しずつ変えてください。色と速度は同じで構いません。
  5. 「ここで描画領域に図形を描く。」のところでは、配列に記憶されているインスタンスのそれぞれについて draw メソッドを呼び出します。繰り返しの回数は、インスタンスが何個あるかによって決まりますが、一番簡単なのは、変数 myBall が記憶している配列の大きさを使う方法です。myBall.length で、配列の大きさ(何個のデータを記憶できるか)が分かるので、その回数だけ繰り返すには
        for (int i = 0; i < myBall.length; i = i + 1) {
           ....
        }
    
    とします。

実行例

10.6 アプリケーションを動かす

アプレットは他のマシンからダウンロードして実行するため、セキュリティ対策上、ファイルアクセスができないなどの制限があります。それに対してアプリケーションは、そのような制限がありません。
自動的にはダウンロードしませんが、もちろん、自分でどこかのウェブサイトからダウンロードすることはできます。怪しげなプログラムをダウンロードして実行しないようにしましょう。これは、Java に限らずどんな言語で書いてあるプログラムでも同じです。

アプリケーションを実行する手順は次のようになります。

  1. アプリケーション用の Java プログラムを書く。
  2. javac コマンドでコンパイルし、class ファイルを作る。
  3. java コマンドで実行する。
        % java クラス名 引数
    
    引数の使い方はこの後で説明します。

10.7 練習問題

Hello World! と端末ウィンドウに出力するアプリケーションを作ってみましょう。

  1. HelloWorld2.java というファイルを作り、以下のプログラムを入力します。
     1
     2
     3
     4
     5
    
    public class HelloWorld2 {
        public static void main(String arg[]) {
    	System.out.println("Hello, world!");
        }
    }
    
  2. これを javac コマンドでコンパイルします。
        % javac HelloWorld2.java
    
  3. できたクラスファイルを java コマンドで実行します。ファイル名ではなく、クラス名を指定することに注意してください。
        % java HelloWorld2
    

10.8 アプリケーションを書く

アプリケーションプログラムを書くときは、次の約束を守ってください。

アプレットと違い、アプリケーションを動かす java コマンドは、最初に main メソッドを呼び出すだけです。インスタンスやウィンドウも自動的には用意してくれませんので、自分で全部書く必要があります。

10.9 アプリケーションの引数

アプレットと同様に、アプリケーションも起動する時に引数(コマンドライン・アーギュメント)を指定して、動作を変えることができます。

java コマンドは、実行するクラス名を指定しますが、その後に好きな文字列を書くことができます。これは、空白で区切って、String型の配列としてプログラムに渡されます

例えば、

    % java HelloWorld2 foo bar
を実行すると、java コマンドは HelloWorld2 というクラスのmain メソッドを呼び出しますが、その時の仮引数 arg には次のような値が入ります。
    arg[0] = "foo";
    arg[1] = "bar";

引数は必ず String 型なので、数値を指定したい場合は Integer.parseInt またはDouble.parseDouble で文字列から数値に変換する必要があります。

10.10 標準出力

java コマンドはウィンドウを用意してくれないので、結果を画面に表示したい場合は

のどちらかになります。標準出力については
情報処理 Ia でやりました

標準出力を管理するインスタンスは System.out という変数に入っています。このインスタンスに対して、次のメソッドを呼び出すと、データを標準出力に出すことができます。

例えば、Hello, World! という文字列を改行付きで標準出力に出したい場合は、

    System.out.println("Hello, World!");
とします。

なお、標準入力については次回にやります。

10.11 練習問題

  1. 次のように、sfc という文字列を縦に5個出力するアプリケーションを書きなさい。
    sfc
    sfc
    sfc
    sfc
    sfc
    
  2. 今度は sfc という文字列を横に5個出力するアプリケーションを書きなさい。空白が無いと文字がくっついてしまいます。
    sfc sfc sfc sfc sfc
    

10.12 宿題

次のように、引数で指定された段数のピラミッド形を sfc という文字で出力するアプリケーション SfcPyramid.java を書きなさい。

    % java SfcPyramid 4
	      sfc 
	    sfc sfc 
	  sfc sfc sfc 
	sfc sfc sfc sfc 
    % 

10.13 おまけ

アプリケーションでウィンドウを作るには、Frame クラスを使います。

Frame クラスを使って、以前に作ったForeignExchange.java をアプリケーションに書き直してみましょう。
[目次] [前回] [次回] [重要語索引]

慶應義塾大学の授業以外での無断利用、複製はご遠慮下さい。
Copyright (c) 2000 慶應義塾大学