Java applet

1  Javaアプレット 開発環境(JDK)のインストール


1 SunMycroSystemsのホームページ  http://java.sun.com/products/jdk/1.1/japan/index.html からJavaSDKをダウンロードします。2000ー3ー14日現在、バージョンは、1.2.2。

ダウンロードした後、解凍すると、jdk1.2.2というディレクトリが出来ます。ディレクトリに「.」が入るのはいやーなのでsdk122というふうにリネームしましょう。

2 スタートボタン >> ファイル名を指定して実行  「sysedit」 を 実行します。

3   「autoexec.bat」ファイルの最後に以下の2行を付加する。「WIN95」と書いてあるのはウィンドウズをインストールしてあるディレクトリなので、違う名前の場合はそれにあわせます。デフォルトでは、「windows]です。

    PATH C:\WIN95;C:\WIN95\COMMAND;C:\DOS;d:\jdk122\bin
    SET CLASSPATH=d:\jdk122\lib\classes.zip

追加が終わったら閉じてウィンドウズを再起動します。

2  とりあえず、アプレットを作ってみる


アプレットは、HTMLにボタンのように貼り付ける形で利用する。直接利用するのは  hogehoge.class とか、 uniuni.class  のように class という拡張子のついたファイル名のファイルです。これをクラスファイルといいます。クラスファイルは、 hogehoge.java や uniuni.java のように  java という拡張子のついたソースファイルをコンパイルして作ります。
さっそくソースを作成します。ソースの拡張子は、「java」だから、Sample1 という名前のクラスをで実験する場合のファイル名は、Sample1.java となります。ソースの中身は、たとえば

-------------------------------------------
import java.applet.Applet;
import java.awt.*;

public class Sample1 extends Applet{
 public void paint(Graphics g){
  g.drawLine(100,25,150,75);
  g.drawLine(150,25,100,75);
  g.drawRect(100,100,200,200);
  g.drawString("12345", 200,200);
 }
}
-------------------------------------------
ってな感じです。これは線を引いたり、四角を書いたり文字列を書いたりします。赤字で書いてある場所は、大文字小文字も含めて同じ名前でなければいけません。つまり、ソースファイル名とクラス名は同じでなければいけないということです。

3  ソースファイルをコンパイルしてクラスファイルを作る


ソースが出来たらコンパイルします。コンパイルするには、まずDOS窓を開き、ディレクトリをソースのある場所に変更します。ディレクトリの変更は、コマンドラインから

CD  C:\WIN95\デスクトップ\JAVA  

のように CD  のあとに移動したいディレクトリを打ち込んでリターンを押します。

ディレクトリが変更出来たら、コンパイルします。コンパイルする方法は、たとえば Sample1.java の場合だと、

javac sampl.java と打ち込みます。エラーが出るとその内容と行番号がでるので、その部分を修正して再びコンパイルします。

エラーメッセージは以下のような感じです。

H:\javaHPtest>javac Sample1.java
Sample1.java:10: gs は未定義な変数またはクラス名です。 ----エラーの内容
gs.drawString("12345", 200,200); ------------------------エラー行


なにも表示されないで終了した場合はコンパイルが成功したということです。不親切ですね。

またコンパイラは、ファイル名の大文字と小文字を区別するので、間違えないように。

4  作ったアプレットを見る HTML上で動作をみる場合


出来たアプレットをHTMLに貼り付けて見る場合はHTMLの中に以下のように記述します。

<applet code="GraphicSample1.class"  //ロードするアプレットの名前
             width="300" //表示エリアの幅
             height="300"> //表示エリアの高さ
</applet>

ネットスケープの場合、サンプルを作るディレクトリ名に日本語が入るとJavaアプレットをロードできなくなるので使わないようにします。デスクトップでもうまく動きません。

IE5では、以下の用に見えます。


ネットスケープでは背景が白で表示される位置も違います。

アプレットをコンパイルし直した場合、ブラウザで更新しても反映されないのでブラウザを立ち上げ直す必要があります。その場合は立ち上げているブラウザのウィンドウを全部閉じる必要があります。

5  作ったアプレットを見る appletviewer を使う場合


ブラウザで動作を見るのは最終的には必要ですが、開発、デバッグでいちいちブラウザを立ち上げなおすのは手間なので、そういう場合はアプレットビューアを使います。これはJDKの中に入っているツールで、アプレットが更新されても立ち上げなおさずにアプレットを読み込みなおせるブラウザのようなツールです。起動方法は、JAVACと同じようにDOS窓から

H:\javaHPtest>appletviewer newpage2.htm

という風に打ち込みます。すると、DOS窓はそのままで、別なウィドウが開いてアプレットが表示されます。



newpage2.htm は、アプレットを呼び出すように作ったHTMLファイルです。このようにアプレットビューアは、ブラウザの用に動作します。

アプレットビューアは、Java総本山のSUNが作ったものなのでこの用に見えるのが正しいはずです。すると、IE5は正しく表示されていない、ということになります。この辺が、マイクロソフトが標準を踏み外しているといわれるところでしょう。しかしIE5はJAVAの起動が早いので開発には便利です。

6  サンプルコード1   禁則処理つきテキスト表示


以下は簡単な禁則処理を実現したテキスト表示用のアプレットです。引数は、Graphics,文字列、表示位置、1行あたりの文字数になっています。
Javaの文字列は、内部でUNICODEで保持しているので、プログラマが半角全角の区別をしないでもよいのでとても楽です。
ついでにテキストの色を変更するテキスト埋め込みコマンドも入っています。


// 簡単な禁則処理を施したテキストの表示ルーチン
public void drawText(Graphics g, String s,int x, int y, int len){
int limit = len; //表示するべき1行の長さ
 
int length = s.length();// 表示する文字数(全角半角それぞれ1個と数える)
int xbyas = 12; // 文字と文字の間隔(ピクセル)
int ybyas = 14; // 文字列の間隔
String sp; // 今の文字が何か判定するためのバッファ
int jp =0; // 現在切り出している文字のポインタ
String jbuff; // 1行かき出すためのバッファ
int lcount = 0; // 1行分文字をコピーしたか数えるカウンタ
int px = x; // 現在の文字列をかく位置x
int py = y; // 現在の文字列をかく位置y
int gyoto = 1; // 行頭かどうかのフラグ 1の時は行頭
int bra=0;
 
while(true){
 bra = 0;
 if(jp == length) return;// 全部終わっていたら帰る
 // 行頭の文字を調べる
  sp= s.substring(jp,jp+1); // 1個め(0から数えて)から2個め前の文字列を切り出す
  int k=0;
  if(sp.indexOf("。")==0)
   k = 1;
  if(sp.indexOf("、")==0)
   k = 1;
  if(k==1){ // 禁則処理の文字なら
   jp ++; // 次の文字に進める
   if(jp == length)return; // 行頭に禁則文字があって終わりなら帰る
  }
  while(true){
   sp= s.substring(jp,jp+1); // 1個め(0から数えて)から2個め前の文字列を切り出す
   if(sp.indexOf("$") !=0){ // 通常の文字なら
 
    g.drawString(sp ,px,py);// 書く
    jp ++; // 次の文字に進める
    lcount ++; // 1行の数を数える
    px += xbyas;
    if(lcount > len){ // 1行終わったら次の行へ行く
     // 前に行頭禁則文字が無いか調べる
     // 本当は行頭に「があればここで書く
     // 行頭にあったら消すものと、行末に書くものがある
     lcount = 0;
     px = x;
     py += ybyas;
     bra = 1; // 内側ループからぬけて次の行へ
    }
    if(jp == length) return;// 全部終わっていたら帰る
   } else {
    // コントロールコードの場合
    jp ++;
    sp= s.substring(jp,jp+1); // 1個め(0から数えて)から2個め前の文字列を切り出す
    if(sp.indexOf("r")==0){ // リターンの場合は次の行へ
     px = x;
     py += ybyas;
     jp++;
     lcount = 0; // 1行の数をクリアする
     bra = 1; // 内側ループから抜ける
    }
 
    if(sp.indexOf("a")==0){ // 色の指定
     jp ++;
     g.setColor(Color.black);
    }
    if(sp.indexOf("b")==0){ // 色の指定
     jp ++;
     g.setColor(new Color(255,128,0));
    }
 
    if(sp.indexOf("c")==0){ // 色の指定
     jp++;
     g.setColor(new Color(0,0,0));
    }
    if(sp.indexOf("d")==0){ // 色の指定
     jp++;
     g.setColor(new Color(255,0,0));
    }
 
    if(sp.indexOf("z")==0){ // 色の指定解除
     jp++;
     g.setColor(Color.black);
    }
   }
 
   if(bra == 1) break;
  }
 }
}