-*- mode: text; mode: auto-fill; fill-column: 54; -*- Java Applet の使い方から Java Applet の書き方 * Java Appletの使い方 Javaのアプレットというのは、Web Pageに組みこむことので きる小さなアプリケーションのことです。Web Pageに組みこ むためには、普通のWeb Pageを書く時と同じような HTMLの タグを使います。Javaアプレットのために作られたタグは です。 まず、JDKについてくるdemoのアプレットを使ったWeb page を作ってみましょう。例えば demo/UnderConstruction にあ る JackhammerDukeというアプレットを使った場合を説明し ます。JDKのdemo/UnderConstruction ディレクトリの下にあ るのは次の通りです。 ---------------------------------------------------------------- JackhammerDuke.java --- このAppletのソースファイル 実行するためには必要ありません JackhammerDuke.class --- JackhammerDuke.javaを コンパイルしたもの audio/jackhammer-short.au --- このAppletで使われる音声ファイル images/jack.gif --- このAppletで使われる画像ファイル example1.html --- sample の HTML ---------------------------------------------------------------- では、このアプレットを組みこんだ Web Pageを書いてみましょ う。エディタを使って次のようなファイルを書き、それを index.html という名前でセーブします。 ---------------------------------------------------------------- リスト1: index.html ---------------------------------------------------------------- Under Construction

This page is under construction

---------------------------------------------------------------- そして同じディレクトリに JackhammerDuke.class を置き、 audioディレクトリ、imagesディレクトリを作り audio/jackhammer-short.au と images/jack.gif も置いて おきます。 ================================================================ % ls JackhammerDuke.class images/ audio/ index.html % ls audio jackhammer-short.au % ls images jack.gif ================================================================ このindex.htmlをappletviewerもしくはJavaが使えるWeb brower(Netscape Navigator 2.xなど)で見てみましょう。 図1 ud.gif このようにJavaアプレットをWeb pageに組みこむには と書けばよいのです。タグからまでがア プレットの部分になります。タグでは少なくとも CODE=, WIDTH=, HEIGHT= の3つは指定しなければなりません。 CODEで指定するのがアプレットのclassファイルです。これ は特に指定がない限りそのHTMLのあったところを同じディレ クトリになければなりません。もし違う場所を指定したい場 合はCODEBASEでその場所をURLで指定します。 そしてWIDTHとHEIGHTでアプレットが使う画面の大きさを pixel単位で指定します。これによりAppletの分の画面の領 域がBrowserによってわりあてられます。 その他 タグで使える属性をまとめておきます。 ---------------------------------------------------------------- タグで使える属性 ---------------------------------------------------------------- CODE= appletFile Appletのclassファイル名 WIDTH= pixels Appletの幅(pixel) HEIGHT= pixels Appletの高さ(pixel) CODEBASE= url Appletをとってくるときの ベースとなるべきURL。 指定しない場合はHTMLと同じ場所にAppletを 置いておけばよい NAME= appletInstanceName Appletの名前 同じHTMLページ内のApplet間で通信する時に使われる ALIGN= alignment Appletをどのように配置するかを指定する と同じく left, right, top, texttop, middle, absmiddle, baseline, bottom, absbottom が指定できる VSCAPE= pixels Appletの上下にいれるスペース(pixel) HSPACE= pixels Appletの左右にいれるスペース(pixel) ALT= text Appletタグは認識するがJava Appletが動かない BrowserがAppletのかわりに表示するテキスト ---------------------------------------------------------------- さて、世の中すべてのBrowserでJavaアプレットが見えるわ けではありません。インラインイメージにALTを付ける ようにJavaアプレットにもJavaが使えない(使わない)人のた めにかわりの文章をつけておくべきです。インラインイメー ジの場合はALT= でできましたが、Javaアプレットの場合は タグとタグの間にかかれた普通のHTMLが、 アプレットのかわりとして利用されます。例えば先に説明し たindex.htmlの...のところを [Under Construction] としておけば、Javaが使えないBrowserだとは無視されて単に images/jack.gif をインライン イメージとして表示します。またイメージも使えない場合は のALTで指定した文が表示されるわけです。逆にJavaが 使えるbrowserではからまでは、後で説明 するアプレットに対するパラメータ指定タグ以外は 無視するようになっているので、このは無視されるわ けです。 ---------------------------------------------------------------- Browser タグ から ---------------------------------------------------------------- Javaが使える 認識する 以外無視 Javaが使えない 無視する 普通のHTMLとして解釈 ---------------------------------------------------------------- ** アプレットのパラメータ JackhammerDukeのようなアプレットの場合、音声ファイルや 画像ファイルがそれぞれaudio/jackhammer-short.au、 images/jack.gifに固定してしまっています。そのため違う 画像や音声を使いたい時はそのファイル名に変更しなければ ならないなど柔軟性にかけます。アプリケーションだとコマ ンドラインの引数なので処理するファイルなどを変更できた りするようにAppletでもパラメータを与えてそれによって画 像や音声ファイル、処理内容などをかえるようにすることが できるようになっています。 例えばアニメーションするアプレットとしてJDKのdemoに Animatorというのがあります。Animator自体はちょっと複雑 ですが、使うだけなら簡単です。demo/Animatorにあるファ イルは以下の通りです。 Animator.java -- Animator Appletのソース Animator.class, ImageNotFoundException.class, ParseException.class -- Animator.javaをコンパイルしたもの images/ -- sampleのimageのあるディレクトリ audio/ -- sampleのimageのあるディレクトリ index.html, example1.html, example2.html, example3.html -- sample の HTML Animatorで10枚の絵でパラパラアニメーションをする場合、 同じディレクトリにT1.gif,T2.gif,...T10.gifというファイ ル名で置いておいて次のようなHTMLを書きます。 ---------------------------------------------------------------- リスト2: animtest.html ---------------------------------------------------------------- Animator Test

Animtor のテスト

---------------------------------------------------------------- このようにアプレットに対するパラメータはから の間のタグによって指定します。 タグではNAME=とVALUE=をそれぞれ指定していきます。NAME= がどういうパラメータかをあわらし、VALUE=がそのパラメー タの値となります。ここでNAME=で指定する文字列は大文字 小文字を区別しません。従って以下のタグは全く同 じです。 だたし、VALUE=の値は、そのままAppletにわたされるので それが大文字小文字を区別しないで利用されるかどうかは アプレットしだいです。 どういうパラメータがあるか、つまりどういうNAME=が有効 かはアプレットによって異なります。Animatorの場合以下の ようなパラメータがあります。 ImageSource "directory" アニメーションするT?.gifがあるディレクトリ Animatorが使う画像ファイルは T数字.gif と いうファイル名になっています。 defaultはAnimatorと同じディレクトリ StartUp "file" イメージをload中に表示しておく画像ファイル Background "file" バックグラウンドの画像 ImageSourceにあるT数字.gif の数字の部分を指定するのに 2つの方法があります。一つめが startImage - endImage で 範囲を指定する方法。もう一つが images により数字のリ ストを指定する方法です。 startImage "num" 何番目の画像からスタートするか? defaultは1 endImage "num" 何番目の画像まで使うか? startImageの値の方がendImageの値より大きい時は 逆順にアニメーションされます。 Images "num|num|.." どういう順序で表示するかを数字のリストで指定します。 数字の部分を | で区切って並べます。 フレーム間(画像と画像の間)でどれくらいウェイトを入れる かも次の2つの方法があります。 pause "msec" フレーム間で何ミリ秒まつか? (default=3900) pauses "msec|msec|..." フレーム毎に何ミリ秒まつかをリストで指定します。 imagesと同じで | で区切って並べます。 repeat "boolean" リピートするか? true か false で指定します。 positions "x@y|x@y|..." フレーム毎にどの位置に表示するかを指定できます。 imagesと同じで | で区切って並べます。 Animatorは画像だけでなくて音声も同時に扱えるようになっ ています。 soundSource "directory" 音声ファイルがあるディレクトリ defaultはAnimatorと同じディレクトリ soundTrack "file" バックグラウンドに流す音声ファイル Sun の .au 形式のファイルが使えます。 sounds "file|file|..." フレーム毎に鳴らす音 imagesと同じようにフレーム毎に |で区切ります。 Animatorのように汎用的なアプレットを作る時はこのような パラメータの説明を書いたドキュメントを作りましょう。 Animatorの場合JDKのdemo/Animator/index.htmlに書いてあ ります。またJavaではアプレットの情報を知るためのインター フェースとして getAppletInfo()とgetParameterInfo()とい うメソッドがApplet classには用意されています。普通のア プリケーションで usageルーチンを作るようにちゃんとした アプレットを書く時はgetAppletInfo()をgetParameterInfo() を書くようにしましょう。 このようなインターフェースが用意されているのでこれらを 使ってどのようなパラメータが使えるかを調べるJavaプログ ラムを書くことができます。 例えばリスト3のようなコードを AppletInfo.javaとしてセー ブしてJava compilerのjavacでコンパイルします。 println()をprintIn()とかprint1n()と間違えないようにし ましょう。 ================================================================ % ls AppletInfo.java % javac AppletInfo.java % ls AppletInfo.class AppletInfo.java ================================================================ こうしてできたAppletInfo.classをアプレットと同じディレ クトリにコピーして実行してみると次のようになります。 ================================================================ % cp AppletInfo.class [Appletのあるディレクトリ] % cd [Appletのあるディレクトリ] % ls Animator.class animtest.html AppletInfo.class audio/ ImageNotFoundException.class images/ ParseException.class % java AppletInfo Animator Applet info: Animator by Herb Jellinek % ================================================================ このように Appletのパラメータなどの簡単な情報がわかり ます。AppletInfo.classを一々コピーするのは面倒な場合は CLASSPATHで指定した場所にコピーしておくとよいでしょう。 ---------------------------------------------------------------- リスト3: AppletInfo.java ---------------------------------------------------------------- /* get Applet Information */ import java.applet.Applet; public class AppletInfo { static void show_applet_info(Applet applet) { System.out.println("Applet info:\t" + applet.getAppletInfo()); return; } static void show_parameter_info(Applet applet) { String pinfo[][]; int i; pinfo = applet.getParameterInfo(); for (i = 0; i < pinfo.length; i++) { System.out.println(""); } return; } static void usage() { System.out.println("usage: java AppletInfo "); } public static void main(String args[]) { Applet applet; try { applet = (Applet)Class.forName(args[0]).newInstance(); System.out.println(""); show_applet_info(applet); show_parameter_info(applet); System.out.println(""); } catch (Exception e) { System.out.println("Exception!: " + e.toString()); usage(); System.exit(-1); } } } ---------------------------------------------------------------- * アプレットの作り方 それではJavaアプレットを自分で書いてみることにしましょ う。K&R[?]にも書かれている通り、どんな言語でも「最初に 書くべきプログラム」である Hello, worldを表示する Java アプレットを書いてみることにしましょう。それは、次のよ うになります。 ---------------------------------------------------------------- リスト4: Hello.java ---------------------------------------------------------------- /* * Hello.java */ import java.applet.Applet; import java.awt.*; public class Hello extends Applet { public void paint(Graphics g) { g.drawString("Hello, world", 10, 10); } } ---------------------------------------------------------------- ---------------------------------------------------------------- class, methodの説明 ---------------------------------------------------------------- Hello (java.applet.Applet <- java.awt.Panel<-Container<-Component) void paint(Graphics g) Appletを描画すべき時に呼ばれます。 Graphics (java.awt.Graphics) void drawString(String s, int x, int y) (x, y)をベースラインのスタートとして 文字列s を描きます。 ---------------------------------------------------------------- これを Hello.java をいう名前でセーブします。javaではソー スファイル名(この場合 Hello.java)はpublicなclass名(こ の場合 Hello)に .java を付けたものでなければなりません。 逆に一つのファイルの中に複数の public classを書いてお くこともできません。(なお、大文字小文字は区別されるの で Windows95などを使っている時はちょっと注意しなければ なりません。) Hello.javaをjavacでコンパイルするとHello.classという Java class fileができます。 ================================================================ % ls Hello.java % javac Hello.java % ls Hello.class Hello.java % ================================================================ 後はアプレットの使い方で説明した通り、このアプレットを使う HTMLファイルを書けばよいわけです。 ---------------------------------------------------------------- リスト5: hello.html ---------------------------------------------------------------- Hello Applet test

これは Hello Applet のテストです。

---------------------------------------------------------------- ================================================================ % ls Hello.class Hello.java hello.html % netscape hello.html ================================================================ 図2 hello.gif では、簡単にHello.javaの解説をします。最初の3行は C と 同じくコメントです。C++の // もコメントとして使えます。 その下のimportの2行ですがこれはCでいう #include に相当 すると思っておけばいいでしょう。importでどのパッケージ のクラスを使うかを指定します。アプレットを書く時は java.applet.Appletとjava.awt.*を使うのでこの2行は必ず 書くものだと思っておいてもよいでしょう。もちろんimport は必ずしなければいけないわけではありません。もしimport java.applet.Applet;を書かないのなら Applet となっている ところで java.applet.Applet と書けばよいのです。ちなみ に java.lang.* はわざわざimportする必要はなく、必ず importしているものとして扱われます。 ---------------------------------------------------------------- //import java.applet.Applet; /* <- import しない場合 */ import java.awt.*; public class Hello extends java.applet.Applet { /* ↑このように書く */ ---------------------------------------------------------------- importの後にAppletクラスであるHelloクラスの定義をしま す。アプレットを書く時はこのように public class アプレット名 extends Applet { アプレット本体 } のように書きます。これはApplet(つまりjava.applet.Applet)を 継承したpublicなclassを作るという意味です。Appletを継 承していないclassはアプレットとして使えませんし、また publicでなければ外から見えないので駄目です。 Hello Appletでは目的は Hello, worldと表示するだけです からAppletクラス(注1)で表示するのに使われるpaint()メソッド でHello, world をいう文字列を表示するようにApplet本体 に public void paint(Graphics g) { g.drawString("Hello, world", 10, 10); } と書けばいいのです。これでアプレットの中の座標(10,10) を文字列の最初のベースラインとして文字列"Hello, world" が書かれます。 ---------------------------------------------------------------- 注1) Appletが継承しているjava.awt.Componentのメソッド。 ちなみにApplet(java.applet.Applet)の親クラスは java.awt.Panel java.awt.Container java.awt.Component java.awt.Conponent である。 ---------------------------------------------------------------- ** アプレットパラメータののとりかた さて Hello, worldと表示するだけではあまりにもつまらな いので、この文字列をパラメータで与えられるくらいに改造 してみましょう。それが Greeing.java です。 ---------------------------------------------------------------- リスト6: Greeting.java ---------------------------------------------------------------- /* Greeting.java */ import java.applet.Applet; import java.awt.*; public class Greeting extends Applet { String message; public void init() { message = getParameter("message"); if (message == null) { message = "Hello, world"; } } public void paint(Graphics g) { g.drawString(message, 10, 10); } } ---------------------------------------------------------------- ---------------------------------------------------------------- class, methodの説明 ---------------------------------------------------------------- Greeting (java.applet.Applet) void init() Applet初期化の時に呼ばれます。 String getParameter(String s) パラメータsを取得します。 ない場合は null をかえします。 ---------------------------------------------------------------- Hello.javaと違うところは ・message という String型の変数がついた。 ・init() というメソッドが増えた。 ・paint()では "Hello, world"という文字列のかわりに String型の変数 message を表示するようになっている。 です。init()メソッドというのはアプレットを初期化する時 に呼ばれるメソッドで、getParameter() でパラメータをとっ てきてインスタンス変数などの初期化をするために使われま す。 AppletにはgetParameter()というメソッドがあり、これを使 うとHTMLのタグから対応するパラメータを取ってく ることができます。つまり message = getParameter("message"); で、 のVALUEである「This is sample message」がmessageに代入さ れます。もしmessageのパラメータが設定されていない場合、 getParameter()は nullをかえしてくるので、 if (message == null) { message = "Hello, world"; } とすることで、messageパラメータがない時はデフォルトで "Hello, world"が messageとして使われるようになります。 したがってリスト7のようHTMLファイルを書けば図3のように なります。最初のAppletはパラメータがないので defaultの "Hello, world"が、次は"Hi!"が、その次は"This is sample message"が表示されます。 ---------------------------------------------------------------- リスト7: greeting.html ---------------------------------------------------------------- Greeting Applet test

これは Greeting Applet のテストです。





---------------------------------------------------------------- 図3 greeting.gif さてアプレットの使い方で述べたように getAppletInfo()と getParameterInfo()を書き方を簡単に説明しておきます。こ の2つのメソッドだけを書くと次のようになります。 public String getAppletInfo() { return "Simple Greetings applet"; } public String[][] getParameterInfo() { String[][] info = { {"message", "string", "greeting messsage"}, }; return info; } getAppletInfo()はアプレットの説明を簡単な文字列としてかえ すようにしておけばいいでしょう。getParameterInfo()の 方は、これで書いたように String型の配列の配列とかえす ことになっています。パラメータについて それぞれ {"パラメータのname属性", "valueの型", "簡単な説明"}, の3つの文字列配列を作ります。パラメータが増えれば String[][]型の info の中にその情報を足していけば いいのです。 ** 動かしてみよう 単に文字列を描くだけでは、わざわざJavaを使う必要なんて ありません。Javaらしく動きを加えてみることにしましょう。 文字列が左から順番に見えてきて、そしてそのうちに左から 消えていくようなアプレットを書いてみます。 そうするとプログラムをリスト8のように書いてしまう人が いるかもしれませんね。一見問題なさそうに見える人もいる かもしれませんが、アプレットでこういうプログラミングを しては駄目です。browserによってはメニューなどが一切反 応しなくなったりしてしまいます。それではどうするのがい いのでしょうか? ---------------------------------------------------------------- リスト8: LoopGreeting.java ---------------------------------------------------------------- /* LoopGreeing.java * ちゃんと動かないバージョン */ import java.applet.Applet; import java.awt.*; import java.util.Date; public class LoopGreeting extends Applet { String greeting; int start, len; int timeout; int step; public String getAppletInfo() { return "Flow Greetings applet"; } public String[][] getParameterInfo() { String[][] info = { {"greeting", "string", "greeting messsage"}, }; return info; } public void init() { greeting = getParameter("greeting"); if (greeting == null) { greeting = "Hello, world"; } start = - greeting.length(); len = greeting.length(); timeout = 200; step = 1; } void scroll(int step) { start += step; if (start > greeting.length()) { start = -greeting.length(); } } void mywait(int t) { Date date1, date2; date1 = new Date(); do { date2 = new Date(); } while (date1.getTime() + timeout >= date2.getTime()); } public void paint(Graphics g) { int s, e; while (true) { scroll(step); s = (start > 0) ? start : 0; e = (start+len < greeting.length()) ? start+len : greeting.length(); g.drawString(greeting.substring(0, e), 10, 10); g.setColor(getBackground()); g.drawString(greeting.substring(0, s), 10, 10); g.setColor(getForeground()); mywait(timeout); } } } ---------------------------------------------------------------- ---------------------------------------------------------------- class, methodの説明 ---------------------------------------------------------------- String (java.lang.String) int length() この文字列の長さを返す String substring(int s, int e) この文字列のs文字目からe文字目をかえす Date (java.util.Date) new Date()で現在の時間が得られる int getTime() ミリ秒単位にする Graphics (java.awt.Graphics) void setColor(Color color) これからcolorの色で描くようにする LoopGreeting (java.applet.Applet <- java.awt.Panel<-Container<-Component) Color getForeground() Appletのフォアグラウンドの色 Color getBackground() Appletのバックグラウンドの色 LoopGreeting void scroll(int step) messageを書きはじめる位置startを step分進める。 ---------------------------------------------------------------- Javaはmulti-threadなので、こういう時はThreadを使えばう まくいきます。つまりAppletのメインのThreadと、ループし ているThreadの2つのThreadを動かすようにすればいいので す。それを考慮して書いたのがリスト9です。 ---------------------------------------------------------------- リスト9: FlowGreeting.java ---------------------------------------------------------------- /* * FlowGreeing.java */ import java.applet.Applet; import java.awt.*; public class FlowGreeting extends Applet implements Runnable { String greeting; Thread kicker; int start, len; int timeout; int step; public String getAppletInfo() { return "Flow Greetings applet"; } public String[][] getParameterInfo() { String[][] info = { {"greeting", "string", "greeting messsage"}, {"timeout", "int", "milliseconds"}, {"step", "int", "chars"}, }; return info; } int getIntParameter(String s, int def) { int r; try { r = Integer.parseInt(getParameter(s)); } catch (NumberFormatException e) { r = def; } return r; } public void init() { greeting = getParameter("greeting"); if (greeting == null) { greeting = "Hello, world"; } start = - greeting.length(); len = greeting.length(); timeout = getIntParameter("timeout", 200); step = getIntParameter("step", 1); } public void start() { if (kicker == null) { kicker = new Thread(this); kicker.start(); } } public void stop() { if (kicker != null) { kicker.stop(); kicker = null; } } public void run() { while (Thread.currentThread() == kicker) { try { kicker.sleep(timeout); } catch (InterruptedException e) { } scroll(step); repaint(); } } synchronized void scroll(int step) { start += step; if (start > greeting.length()) { start = -greeting.length(); } } public void paint(Graphics g) { int s0; int s, e; s0 = start; s = (s0 > 0) ? s0 : 0; e = ((s0 + len) < greeting.length()) ? (s0+len) : greeting.length(); g.drawString(greeting.substring(0, e), 10, 10); g.setColor(getBackground()); g.drawString(greeting.substring(0, s), 10, 10); g.setColor(getForeground()); } } ---------------------------------------------------------------- ---------------------------------------------------------------- class, methodの説明 ---------------------------------------------------------------- Integer (java.lang.Integer) int parseInt(String s) 文字列sを数字として解釈します(Cのatoi()) もし文字列sが数字として解釈できなかった 時は NumberFormatExceptionがなげられる ので、getIntParameter()でやっている ように try {} catch(e) {} とします。 Thread (java.lang.Thread) new Thread(Runnable target)でtarget.run() を実行するための新しいThreadを作ります。 Thread currentThread() 現在のThreadをかえします。 void start() target.run()をこのThreadで動かし始めます。 void stop() このThreadを止めます。 void sleep(int timeout) timeoutミリ秒だけ停止します。 FlowGreeting (java.applet.Applet) void start() Appletのあるページに来た時にBrowserから呼ばれます。 void stop() Appletのあるページから別のページに移る時に Browserから呼ばれます。 FlowGreeting (java.lang.Runnbale) void run() Threadのstart()から新しいThreadとして動かされます。 run()が終わるとこのThreadは終了します。 FlowGreeting (java.applet.Applet <- java.awt.Panel<-Container<-Component) void repaint() Appletを再描画したい時に呼びます。 その結果、update()で背景色で消された後 paint()が呼ばれます。 ---------------------------------------------------------------- Threadにする時のポイントを簡単に説明します。 まず、Threadとして動かすclassは interface Runnableを 実装します。つまり class クラス名 extends 親クラス implements Runnable { public void run() { Threadで実行される部分 } } とします。Runnbaleを実装する時は public void run() メソッドを必ず用意しなければいけません。 Threadの起動および停止は普通はリスト9のstart()、stop() のようにすればよいでしょう。new Thread(this)とすること でthisつまり自分自身(この場合はFlowGreetingアプレット) に対する新しいThreadを作ることになります。そしてその Threadオブジェクト(kicker)のstart()メソッドを呼ぶこと でこのThreadを作った時に渡したオブジェクト、つまり FlowGreetingアプレットのrun()が別Threadとして起動され ます。 browserが別のページに移る時などはstop()が呼ばれること になっているので、stop()でThreadは止めるようにしておき ましょう。さもないと裏で動きつづけることになってしまい ます。Threadの止め方もリスト9のstop()のようにkickerの stop()を呼んでスレッドを止めてkickerをnullにしてしまい ます。 kicker.start()によってThreadがスタートすると、 FlowGreetingアプレットのrun()メソッドが呼ばれます。こ の中ではリスト9のようにループするようにします。一応、 kickerが自分のThreadであることを確認してtimeoutで指定 した分ミリ秒単位で待ちます。このsleep()は InterruptedException をいう例外を投げてくることがある ので呼びだす方はリスト9のように try {} catch を使いま す。 try { kicker.sleep(timeout); // InterruptedExceptionを投げる場合がある } catch (InterruptedException e) { // InterrptedExceptionがおきた時の処理 } そしてscroll(step)を呼ぶことでmessageを描画する範囲 を動かし、repaint()によって再描画します。repaint()を呼 ぶと、途中update()によって全部消された後paint()が呼ば れることになっています。このようにインスタンス変数など がかわってアプレット側から画面の更新をしたい時に repaint()を呼ぶようにします。 最後にscroll(step)では startをstep分動かすという処理で すが、これは途中の状態で描画されたりするとよくないので、 途中でわりこまれない単一の処理ということで synchronized をつけておくと安全です。 とにかく、run()の中でアプレット独自の処理をおこない再 描画が必要な時にrepaint()を呼ぶようにしておき、paint() ではアプレットが描くべきものを常に書くようにコードを書 けばよいでしょう。 [参考文献] Arthur van Hoff, Sami Shaio, Orca Starbuck, `HOOKED on JAVA,' Addison Weslay Developers Press. WhitePaper, James Gosling, Henry McGilton, `The Java Language Environment -- A White Paper,' Sun Microsystems Computer Company. The Java Tutorial, Sun Microsystems, Inc. K&R B.W.Kernighan, D.M.Richie, `プログラミング言語C 第2版 ANSI規格準拠,' 石田晴久訳, 共立出版.