| ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 2007年07月22日 楽しいJava講座 - 初心者から達人へのパスポート vol.063 セルゲイ・ランダウ バックナンバー: http://www.flsi.co.jp/Java_text/ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ [このメールマガジンは、画面を最大化して見てください。] ======================================================== ◆ 01.グラフィックスのプログラミング ======================================================== お絵描きソフトの作成方法の基本は、前回までで理解していただ けたことと思います。 今回からはトピックを変え、時計のプログラムを作成することに します。 ご存知のようにコンピューターには時計が内蔵されていますので、 現在の日付や時刻を簡単に調べることができます。 しかし、それをそのまま数字で表示しただけの時計にしてしまっ ては、プログラミングの勉強になりません。 (今回の目的は、動きのあるグラフィックス(アニメーション)の プログラミングを学ぶことです。) 今回のプログラムはコンピューターに内蔵されている時計に時刻 を問い合わせた後、それを短針、長針、秒針の図形に計算し直し て、アナログ時計のような画像を描きます。そして、一定の時間 間隔で新しい時刻の画像に差し替えていくことにより、アナログ 時計の動きを見せます。 (アニメーションは基本的にはパラパラ漫画と同じ原理で動きま す。すなわち、少しずつ変化する絵をパラパラと入れ替えて表示 していくことによって動きを見せます。) それができたら、次は、予約しておいた時刻にアラーム音を鳴ら すという、アラーム・クロック(alarm clockもしくは目覚まし 時計)の機能を組み込みます。 また、その次には、補助的な小さな時計を付け足して、外国の時刻 も同時に表示できるようにする、といったふうに、どんどんと 付加的な機能を追加していくことにします。 なお、アラーム・クロックを作るためには、アラーム音のファイル が必要になります。のちほど、アラーム音のファイルをホームペー ジに掲載しておきますので、各自ダウンロードしてご利用ください。 ┌補足─────────────────────────┐ パソコンに内蔵されている時計は、それほど正確ではありませんの で、ほったらかしにしていると、だんだんと時刻がくるってきます。 幸い、インターネットの世界では、NTP(Network Time Protocol) と呼ばれるプロトコルを使用することによって、インターネット上 の正確な時計を持つコンピューターに、正確な時刻を問い合わせる ことができます。 最近のWindows(Windows XP以降)では、この仕組みによって、 内蔵時計を正確な時刻に自動調整する機能がついており、そのおかげ で時刻がくるわなくなりました。(ただし、インターネットに接続 していなければ自動調整の機能は働きません。) 当メールマガジンでも、そのうちにNTPを使って正確な時刻を取得し、 表示するプログラムの作り方も紹介したいと思います。 └───────────────────────────┘ 今回のプログラムでは、文字盤(1〜12の数字が書かれている円形の板) の上に短針(short hand)、長針(long hand)、秒針(second hand)を描画 しなければなりませんが、これらの針の先端の座標は数学の三角関数を 使って計算します。 当メールマガジンは数学の説明まではしませんので(数学のメールマガ ジンではありませんので)、三角関数を習った人は、下記プログラムを 自分で解読し、どのようにして座標を計算しているのか、自力で理解し てみてください。 なお、その際、y軸の向きが数学とは逆である(y座標が下にいくほど 大きくなる)ことに注意してください。 三角関数を習っているけれど、下記プログラムの中の計算式はどうして も理解できないという人は、質問をお寄せください。 まだ三角関数を習っていない人や数学の苦手な人は、下記プログラムの 中の計算式は理解できなくてもいいですから、無視してください。 では、さっそくEclipseを起動してプログラムの作成にはいりましょう。 JStudy1プロジェクトの中にjp.co.flsi.lecture.clockというパッケージ を作ってください。 このパッケージの中に下記のようなClockPictureというクラスを作りま しょう。これは、与えられた時刻に対してアナログ時計の画像を描くため のクラスです。 -------------------------------------------------------- package jp.co.flsi.lecture.clock; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.util.Calendar; import java.util.GregorianCalendar; public class ClockPicture { private GregorianCalendar currentTime = new GregorianCalendar(); private int centerX = 80; private int centerY = 110; private int radius = 70; public void setCurrentTime(GregorianCalendar currentTime) { this.currentTime = currentTime; } public GregorianCalendar getCurrentTime() { return currentTime; } public void setCenterX(int centerX) { this.centerX = centerX; } public int getCenterX() { return centerX; } public void setCenterY(int centerY) { this.centerY = centerY; } public int getCenterY() { return centerY; } public void setRadius(int radius) { this.radius = radius; } public int getRadius() { return radius; } public void drawShortHand(Graphics2D g2d) { g2d.setColor(new Color(0, 100, 100)); g2d.setStroke(new BasicStroke(6f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); double t = currentTime.get(Calendar.HOUR) + currentTime.get(Calendar.MINUTE) / 60d; double r = getRadius() * 0.6; double x2 = getCenterX() + r * Math.cos(1.571 - 0.5236 * t); double y2 = getCenterY() - r * Math.sin(1.571 - 0.5236 * t); g2d.drawOval(getCenterX() - 4, getCenterY() - 4, 8, 8); g2d.drawLine(getCenterX(), getCenterY(), (int) x2, (int) y2); } public void drawLongHand(Graphics2D g2d) { g2d.setColor(Color.BLUE); g2d.setStroke(new BasicStroke(4f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); int t = currentTime.get(Calendar.MINUTE); double r = getRadius() * 0.9; double x2 = getCenterX() + r * Math.cos(1.571 - 0.1047 * t); double y2 = getCenterY() - r * Math.sin(1.571 - 0.1047 * t); g2d.drawOval(getCenterX() - 3, getCenterY() - 3, 6, 6); g2d.drawLine(getCenterX(), getCenterY(), (int) x2, (int) y2); } public void drawSecondHand(Graphics2D g2d) { g2d.setColor(Color.RED); g2d.setStroke(new BasicStroke(2f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); int t = currentTime.get(Calendar.SECOND); double x2 = getCenterX() + radius * Math.cos(1.571 - 0.1047 * t); double y2 = getCenterY() - radius * Math.sin(1.571 - 0.1047 * t); g2d.drawOval(getCenterX() - 1, getCenterY() - 1, 2, 2); g2d.drawLine(getCenterX(), getCenterY(), (int) x2, (int) y2); } public void drawAll(Graphics2D g2d) { g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(new Color(200, 200, 200)); g2d.fillOval(getCenterX() - radius - 9, getCenterY() - radius - 9, 2 * radius + 20, 2 * radius + 20); g2d.setColor(new Color(230, 230, 230)); g2d.fillOval(getCenterX() - radius - 7, getCenterY() - radius - 7, 2 * radius + 14, 2 * radius + 14); g2d.setColor(Color.BLACK); for (int i = 1; i < 13; i++) { double x2 = getCenterX() - 3 + radius * Math.cos(1.571 - 0.5236 * i); double y2 = getCenterY() + 5 - radius * Math.sin(1.571 - 0.5236 * i); g2d.drawString("" + i, (int) x2, (int) y2); } drawShortHand(g2d); drawLongHand(g2d); drawSecondHand(g2d); } } -------------------------------------------------------- このクラスでは、currentTimeは現在時刻を表し、centerXは時計の中心 のx座標、centerYは時計の中心のy座標、radiusは文字盤の半径(中心 から文字の位置までの距離)を表します。 このクラスのインスタンスにsetCurrentTime()で現在時刻(GregorianCalendar型) を設定してやれば、drawAll()メソッドでその時刻の時計の絵が描けます。 なお、数学のπ(パイ)はJavaではMath.PIというMathのstaticフィール ドで表されますが、上記のソース・コードでは、Math.PIは使わずに直接 計算後の数値を使っています。たとえば、1.571という数値はπを2で割っ た計算後の数値です。 このように、プログラミングの前に計算しておけば済むものは予め計算し ておいて、その計算結果の数値をプログラムの中に組み込むのが効率的な やり方です。 上記のソース・コードの中で初登場したdrawString()というメソッドは、 Graphicsのメソッドで、グラフィックスに文字列を書き込むためのメソッ ドです。 第一引数には書き込みたい文字列を指定し、第二引数には、書き込みを 開始する位置のx座標、第三引数には書き込みを開始する位置のy座標を 指定します。 なお、必要ならばdrawString()メソッドを呼び出す前にsetFont()メソッ ドを使ってフォント(の種類やサイズなど)を指定することができます。 詳しくはAPIリファレンスなどで調べてください。 また、drawOval()、fillOval()はともに楕円を描くためのメソッド(この うちfillOval()は内部を塗りつぶす)ですが、縦と横を同じサイズにする と、円になります。 (今回は線の幅を太くしているので、drawOval()で描いても塗りつぶして いるかのように見えます。) なお、文字盤を描くときに、位置が少しずれた2つの円(少し異なる色で 内部を塗りつぶしたもの)を描いていますが、これは文字盤に立体感を 出させるためのものです。 本格的に立体感を出すためには、一方から光があたり、その反対側には 影ができるような描き方をしますが、ここではそのような複雑な描き方は 省略します。 それでは、続いて、このClockPictureを使って時計を表示するためのパネル を作りましょう。ClockJPanelというクラス名にします。 jp.co.flsi.lecture.clockパッケージの中にClockJPanelをJPanelのサブ クラスとして、ビジュアル・クラス(Visual Class)として作成しましょう。 つまり、パッケージ・エクスプローラーの中のJStudy1の中のjp.co.flsi.lecture.clock を右クリックし、「新規」→「その他」→(「Java」の中の)「Visual Class」 を選択し「次へ」ボタンをクリックし、「名前」欄にClockJPanelと入力し、 「Style」欄で(Swingの中の)Panelを選択し、「終了」ボタンをクリックしま す。 ClockJPanelのVEエディターが開きましたら、まず最初にパネルのサイズを 変更しておきましょう。 デフォルトでは、横300ピクセル、縦200ピクセルになっていますが、時計 を表示するのにこんな横長のサイズは必要ありませんので、横170ピクセル に変更します。 すなわち、initialize()メソッドの中の -------------------------------------------------------- this.setSize(300, 200); -------------------------------------------------------- の行を -------------------------------------------------------- this.setSize(170, 200); -------------------------------------------------------- に変更します。(あるいは「プロパティー」ビューの中でsizeプロパティー の値を170,200に変更してもよい。) では続いて、このClockJPanelにClockPictureを組み込むことにしましょう。 パレットから「Choose Bean」を選択し、「Choose a Bean」ウインドウにお いてClockPictureを入力して「OK」ボタンをクリックし、パネルの画像の外側 の白いところ(空白のエリア)をクリックすることによって貼りつけます。 Bean NameはclockPictureにしておきましょう。 そうするとgetClockPicture()というメソッドが自動的に生成されますね。 このメソッドを使えば、ClockPictureのインスタンスを取り出すことがで きます。 このClockPictureのインスタンスは、セットした時刻をアナログ時計の画像 にして表示してくれますから、パラパラ漫画のようにパタパタと繰り返し 新しい現在時刻をセットしなおして画像を表示しなおすということを行えば、 時間通りに動く時計ができあがります。 このような動きのあるプログラムを作るためには、Threadを使ってマルチ スレッドにします。マルチスレッドにする理由は後で説明します。 では、マルチスレッドにするために、ClockJPanelにRunnableインター フェースを実装させましょう。 -------------------------------------------------------- public class ClockJPanel extends JPanel { -------------------------------------------------------- の行を -------------------------------------------------------- public class ClockJPanel extends JPanel implements Runnable { -------------------------------------------------------- に書き換えてください。 すると、Runnableインターフェースのrun()というメソッドを実装しなけ ればならなくなりますね。(まだrun()を実装していないためにエラーの マークがついたはずです。) はい。ClockJPanelのソース・コードに下記のようなrun()メソッドを 追加してください。 -------------------------------------------------------- public void run() { while(runningFlag) { repaint(); try { Thread.sleep(100); } catch(InterruptedException e) { } } } -------------------------------------------------------- ここで、runningFlagというは、このスレッドの実行を継続させるか停止さ せるかを制御するためのフィールドにするつもりですが、まだ定義していま せん。(未定義ですからエラーになりますね。) では、次のようなフィールド定義をClockJPanelのソース・コードに追加し てください。 -------------------------------------------------------- private boolean runningFlag = false; -------------------------------------------------------- このrunningFlagフィールドの値がtrueの間はrun()メソッドのwhileループ の実行が継続され、runningFlagフィールドの値がfalseになるとrun()メソッ ドのwhileループの実行が終了することになります。 つまり、runningFlagがtrueの間はこのスレッドの実行が継続され、falseに なるとスレッドの実行が停止するというわけです。 では、今度はこのスレッドを起動するためのメソッドを作りましょう。 clockStart()というメソッド名にし、下記のようなコードにしましょう。 このメソッドもClockJPanelのソース・コードに追加してください。 -------------------------------------------------------- public void clockStart() { runningFlag = true; Thread aThread = new Thread(this); aThread.start(); } -------------------------------------------------------- また、逆にこのスレッドを停止するための下記のようなメソッドを ClockJPanelのソース・コードに追加してください。 -------------------------------------------------------- public void clockStop() { runningFlag = false; } -------------------------------------------------------- 最後に、時計の画像を描画するためにpaint()メソッドを実装しましょう。 下記のようなpaint()メソッドをClockJPanelのソース・コードに追加して ください。 -------------------------------------------------------- public void paint(Graphics g) { Image image = createImage(170, 200); Graphics2D g2dImage = (Graphics2D) image.getGraphics(); GregorianCalendar newTime = new GregorianCalendar(); g2dImage.drawString("本日:" + newTime.get(Calendar.YEAR) + "年" + (newTime.get(Calendar.MONTH) + 1) + "月" + newTime.get(Calendar.DAY_OF_MONTH) + "日" , 20, 13); g2dImage.drawString("現在:" + newTime.get(Calendar.HOUR_OF_DAY) + "時" + newTime.get(Calendar.MINUTE) + "分" + newTime.get(Calendar.SECOND) + "秒" , 20, 25); getClockPicture().setCurrentTime(newTime); getClockPicture().drawAll(g2dImage); g.drawImage(image, 0, 0, 170, 200, null); } -------------------------------------------------------- このメソッドは、コンピューターの内蔵時計から現在時刻を取り出し (「new GregorianCalendar()」でGregorianCalendarのインスタンスを 生成すると現在時刻を持ったインスタンスが作られる)、それから、 本日の日付や現在時刻を文字列で描き出しています。その後、ClockPicture のインスタンスに現在時刻をセットして時計を描画させています。 ここでもやはり、以前説明したオフスクリーン描画イメージ(vol.057参照) を使用していることはおわかりですね。 さきほどのrun()メソッドのループで100ミリ秒おきにrepaint()を実行し ていますから、このpaint()メソッドは100ミリ秒おきに繰り返し呼び出さ れることになります。 秒針は1秒ごとに動きますから、1秒おきに呼び出せばいいのでは、と思う かもしれませんが、そうすると、タイミングが悪ければ秒針の動きが最大1秒 遅れてしまう可能性もあります。 したがって、もっと細かい間隔で呼び出したほうがいいのです。 でもあまり細かく(たとえば1ミリ秒ごとに)呼び出してしまうと、その分 よけいにCPUを使ってしまうことになるので、あまり細かくしすぎるのも好ま しくありません。 100ミリ秒おき〜200ミリ秒おき程度の間隔が望ましいでしょう。 できあがったClockJPanelがどのように時計を表示するのか確認したい場合は、 パッケージ・エクスプローラーのClockJPanelを右クリックし、「実行」→ 「Java Bean」を選択すれば見られます。ただし、paint()メソッドが呼び出さ れるだけであり、clockStart()メソッドを呼び出しているわけではないので、 時計は動きません。 では、続いて、このClockJPanelを使って時計を動かして表示するためのアプ レットを作りましょう。ClockAppletというクラス名にします。 jp.co.flsi.lecture.clockパッケージの中にClockAppletをJAppletのサブクラ スとして、ビジュアル・クラス(Visual Class)として作成しましょう。 つまり、パッケージ・エクスプローラーの中のJStudy1の中のjp.co.flsi.lecture.clock を右クリックし、「新規」→「その他」→(「Java」の中の)「Visual Class」 を選択し「次へ」ボタンをクリックし、「名前」欄にClockAppletを入力し、 「Style」欄で(Swingの中の)Appletを選択し、「終了」ボタンをクリックします。 ClockAppletのVEエディターが開きましたら、まず最初にアプレットの中の パネル(jContentPane)のレイアウト・マネジャーをnullにしておきましょう。 すなわち、アプレットの画像の中を右クリックし、「Set Layout」→「null」を 選択します。 また、同パネルの背景(background)を白色にしておきましょう。アプレット の画像の中をクリックして選択状態にし、「プロパティー」ビューの中の backgroundプロパティーの値をColor.white(「Java Property Editor」の 「Named Colors」タブでwhiteを選択する)にしておきましょう。 続いて、このアプレットにClockJPanelを貼り付けることにしましょう。 パレットから「Choose Bean」を選択し、「Choose a Bean」ウインドウにおい てClockJPanelを入力して「OK」ボタンをクリックし、アプレットの画像の中に 貼り付け(クリック)してください。Bean NameはclockJPanelにしておきま しょう。 そうするとgetClockJPanel()というメソッドが自動的に生成されますね。 このメソッドの中の -------------------------------------------------------- clockJPanel.setBounds(new Rectangle(24, 71, 10, 10)); -------------------------------------------------------- という行(数字は貼り付け位置によって異なります)を -------------------------------------------------------- clockJPanel.setBounds(new Rectangle(0, 0, 170, 200)); -------------------------------------------------------- に書き換えましょう。 これで、ClockJPanelがアプレットの左側にぴったりときれいに張り付きましたね。 (アプレットの右側のあいている空間は後でアラームの機能などに使用します。) では次に、このClockAppletが起動されたら時計が動き出すように、プログラミ ングしましょう。 init()メソッドの最後に -------------------------------------------------------- getClockJPanel().clockStart(); -------------------------------------------------------- という行を追加してください。 念のために編集後のinit()メソッド全体のコードを下に提示します。 -------------------------------------------------------- public void init() { this.setSize(300, 200); this.setContentPane(getJContentPane()); getClockJPanel().clockStart(); } -------------------------------------------------------- 最後に、このClockAppletが終了するときに時計も停止されるように、プログラ ミングしましょう。 ClockAppletのソース・コードの最後にでも次のようなメソッドを追加してくだ さい。 -------------------------------------------------------- public void destroy() { getClockJPanel().clockStop(); } -------------------------------------------------------- destroy()メソッドが何だったか忘れた人はvol.058を復習してください。 では、保管したあと、ClockAppletを実行してテストしてみてください。 ちゃんと時計が動きますね。 ところで、時計を動かすためになぜマルチスレッドにする必要があったのか というと、もしシングルスレッドにしてしまうと、時計を動かすためのwhile ループだけがいつまでも実行し続ける状態になってしまって、このソフトの他 の機能が動かなくなってしまうからです。 一般に、GUIのプログラムでは、ループなどの長時間を要する処理は別のスレッ ド(マルチスレッド)で実行する必要があります。もしシングルスレッドにして しまうと、ループ以外の処理が実行できなくなり、メニューを操作したり、ボタ ンをクリックしても何も反応してくれないという状態(いわゆる「固まってしま う」という状態)になってしまいます。 そのために今回のプログラムでは、時計を動かすためのwhileループを (ClockJPanelの)run()メソッドの中に作って、別のスレッドで実行するように しているのです。 では、今回はここまでにします。なお、今回作成したアプレットはホームページ にも掲載しておきますので、正しく作成されたアプレットの動きを確認したい人 は下記ホームページのvol.063の項目から実行してみてください。 http://www.flsi.co.jp/Java_text/ 何か、わからないところがありましたら、下記のWebページまで質問をお寄せ ください。 (続く) ======================================================== ◆ 02.文法解説 [アプレット(4)「アプレットの起動」] ======================================================== [アプレット(4)「アプレットの起動」] 完成したアプレットは通常、関連するファイル(参照しているクラスのファイル や使用する画像ファイル、音声ファイルなど)といっしょにJARファイルにして からWebサーバー(インターネットの世界でWebページを提供するコンピューター) に入れておきます。 (Webサーバーについては別の機会に詳しく説明します。) vol.055でも紹介しましたが、JARファイルは以下のようにしてEclipseの エクスポート機能で作成することができます。 例として、今回作成したClockAppletを実行するためのJARファイルを作成す ることにしましょう。 (1) パッケージ・エクスプローラーの中のJStudy1の中のjp.co.flsi.lecture.clock を右クリックし、「エクスポート」を選択します。 (2) 「エクスポート」ウインドウの中で、「Java」の中の「JARファイル」を 選択(クリック)し、「次へ」ボタンをクリックします。 (3) 「生成されたクラス・ファイルとリソースをエクスポート」と「JARファイ ルの内容を圧縮」にチェック・マークを入れます。そして「JARファイル」の 右側の「参照」ボタンをクリックし、JARファイルを書き出すフォルダーとファ イル名を指定します。ここでは、フォルダーはJavaWorksを指定し、ファイル名 はclockapplet.jarにすることにしましょう。(ファイル名を入力したら「保存」 ボタンをクリックします。) そして、「次へ」ボタンをクリックします。 (4) 次のページはデフォルト(そのまま)のままにして、「次へ」ボタンをク リックしましょう。 (5) マニフェストとシールについてはデフォルトのままにしておいてください。 また、「メイン・クラス」にも何も入力する必要はありません。 (6) 「終了ボタン」をクリックします。 (7) 「JARエクスポートが警告とともに終了しました。」のメッセージが出て も無視して「OK」ボタンをクリックしてください。 これで、JavaWorksフォルダーにclockapplet.jarというJARファイルができてい ます。 アプレットは基本的にはWebページに掲載するためのものですから、アプレット を実行するためには、HTML(Webページを記述する言語)にアプレットの起動の ための記述を行っておく必要があります。 (HTMLについては別の機会に詳しく説明します。) 従来は、アプレットをダウンロードして起動するために、HTMLに下記のような 「APPLET」タグを記述していました。 (JARファイルがHTMLファイルと同じ場所に存在する場合) -------------------------------------------------------- <APPLET CODE="packagename.Appletname.class" ARCHIVE="jarname.jar" WIDTH=250 HEIGHT=300> </APPLET> -------------------------------------------------------- なお、WIDTHにはアプレットを表示したい横幅、HEIGHTにはアプレットを表示し たい縦の高さを(ピクセルで)指定します。 このコードがあるとWebブラウザーは指定されたアプレットをダウンロードして Webブラウザーに備え付けられているJVM(Java Virtual Machine)で実行します。 vol.059でお話したように、アプレットにはパラメーターを指定することもでき ますが、その場合には以下のように「PARAM」タグを指定します。 -------------------------------------------------------- <APPLET CODE=packagename.Appletname.class ARCHIVE=jarname.jar WIDTH=250 HEIGHT=300> <PARAM NAME=paramname1 VALUE="paramname1の値"> <PARAM NAME=paramname2 VALUE="paramname2の値"> </APPLET> -------------------------------------------------------- 上記のparamname1やparamname2はアプレットの中でgetParameter()メソッドを 呼び出すときに引数に指定した文字列です。 例えば、アプレットのソース・コードの中に -------------------------------------------------------- String param1 = getParameter("paramname1"); String param2 = getParameter("paramname2"); -------------------------------------------------------- のようなコードがあった場合は、上記のPARAMタグから該当する値が取り出され、 それぞれparam1には"paramname1の値"が代入され、param2には"paramname2の値" が代入されることになります。 今回作成したClockAppletをclockapplet.jarの中から起動する場合のHTML全体の 簡単な例をあげると以下のようになります。(JARファイルがHTMLファイルと同じ 場所に存在する場合) -------------------------------------------------------- <HTML> <HEAD> <TITLE>アナログ時計のアプレット</TITLE> </HEAD> <BODY> <APPLET CODE=jp.co.flsi.lecture.clock.ClockApplet.class ARCHIVE=clockapplet.jar WIDTH=300 HEIGHT=200> </APPLET> </BODY> </HTML> -------------------------------------------------------- (JARファイルがHTMLファイルと別の場所に存在する場合は、そのURLをCODEBASEに 指定する必要があります。たとえば、HTMLファイルが存在するディレクトリーの サブディレクトリーxyzにJARファイルが存在する場合は、 <APPLET CODE=jp.co.flsi.lecture.clock.ClockApplet.class CODEBASE=xyz ARCHIVE=clockapplet.jar WIDTH=300 HEIGHT=200> というような指定になります。) しかし、このAPPLETタグを使う方法では、あらかじめWebブラウザーに備え付けら れているJVMが使用されるため、そのJVMが古いものだったり標準と異なるものだっ たりすると、アプレットが正常に動作しなかったり、問題を起す恐れがあります。 あるいは、そもそもWebブラウザーにJVMが備え付けられていない場合にはアプレッ トが作動しません。 そのため、最近では上記の方法は使われなくなってきており、代わりに下記のよう なHTMLが使われます。 -------------------------------------------------------- <HTML> <HEAD> <TITLE>なんとかかんとか</TITLE> </HEAD> <BODY> <OBJECT classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=1,5,0,0" WIDTH = 400 HEIGHT = 300 > <PARAM NAME="code" VALUE="packagename.Appletname.class"> <PARAM NAME="archive" VALUE="jarname.jar"> <PARAM NAME="type" VALUE="application/x-java-applet;version=1.5"> <PARAM NAME="paramname1" value = "paramname1noatai"> <comment> <embed type = "application/x-java-applet;version=1.5" CODE = packagename.Appletname WIDTH = 400 HEIGHT = 300 paramname1 = paramname1noatai pluginspage = "http://java.sun.com/products/plugin/index.html#download"> <noembed> Your browser does not support Java! </noembed> </embed> </comment> </OBJECT> </BODY> </HTML> -------------------------------------------------------- このうち、OBJECTタグはInternet Explorerのためのもので、embedタグは モジラ(Mozilla = Netscapeがオープン・ソース化したもの)系のWebブラ ウザーのためのものです。 (なお、JARファイルがHTMLファイルと別の場所に存在する場合は、APPLET タグの場合と同様に、OBJECTタグでは、 <PARAM NAME="codebase" VALUE="xyz"> embedタグでは CODEBASE = xyz といった記述が必要になります。) 詳しくは、 http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/plugin/developer_guide/using_tags.html などを参照してください。 なお、上記のHTMLは、見ての通り、JRE 1.5.0を使っている場合のものです。 アプレットが別のJavaのバージョンで開発された場合は、別のバージョンを 指定します。 このバージョンとcodebaseに指定するファイルの関係については、詳しくは、 http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/deployment/deployment-guide/autodl-files.html などを参照してください。 (JRE(Java Runtime Environment)は大雑把にはJVMのことと思えばよいが、詳し く言うとJVMの他に基本的なAPIなど、プログラムの実行環境として不可欠なファ イルを含むものである。これらはバージョンによって少し異なるため、アプレッ ト開発時のJavaのバージョンに合わせておかないと問題がおこることがある。) このHTMLを使うと、Webブラウザーに該当するJVMが組み込まれていない場合は 該当するJVMがjava.sun.comからダウンロードされてWebブラウザーに組み込ま れ(インストールされ)ます。 このようにWebブラウザーに組み込まれて使用されるJVMを「Javaプラグイン (Java Plug-in )」と呼びます。 Javaプラグインについては、詳しくは http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/plugin/developer_guide/contents.html などを参照してください。 該当するJavaプラグインがすでにWebブラウザーに組み込まれ済みの場合は、 それがそのまま使用されます。 したがって、初めてアプレットを起動するときにはJavaプラグインのインストー ルのために余計に時間がかかることになりますが、2度目以降の起動時には余計な 時間はかかりません。 今回作成したClockAppletをclockapplet.jarの中から起動する場合のHTML全体の 簡単な例をあげると以下のようになります。(clockapplet.jarは当HTMLファイル と同じ場所にあるものとします。) -------------------------------------------------------- <HTML> <HEAD> <TITLE>アナログ時計のアプレット</TITLE> </HEAD> <BODY> <OBJECT classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=1,5,0,0" WIDTH = 300 HEIGHT = 200> <PARAM NAME="code" VALUE="jp.co.flsi.lecture.clock.ClockApplet.class"> <PARAM NAME="archive" VALUE="clockapplet.jar"> <PARAM NAME="type" VALUE="application/x-java-applet;version=1.5"> <comment> <embed type = "application/x-java-applet;version=1.5" CODE = jp.co.flsi.lecture.clock.ClockApplet.class WIDTH = 300 HEIGHT = 200 archive = clockapplet.jar pluginspage = "http://java.sun.com/products/plugin/index.html#download"> <noembed> Your browser does not support Java! </noembed> </embed> </comment> </OBJECT> </BODY> </HTML> -------------------------------------------------------- (続く) 以上、今回は ┌───────────────────────────┐ ・動きのあるグラフィックス(アニメーション)の描画方法 ・アナログ時計の描画方法 ・GraphicsのdrawString()の使い方(グラフィックスに文字列を描く方法) ・スレッドの停止の仕方 ・アプレットの起動の仕方 └───────────────────────────┘ を学習しました。 では、また来週。 ================================================ ◆ 03.演習問題 ================================================ HTMLについての知識がある人は、今回作成したアプレットを上記の [アプレットの起動]の方法でHTMLから起動できることを実際に確認 してください。 なお、Internet Explorerの設定によっては、実行するプログラムが 安全であるかないかに関わらず、警告を発するようになっています。 そのため、Internet Explorerが「情報バーにお気づきですか?・・・・」 のウインドウを表示することがありますが、そのときは、「OK」ボタンを クリックし、「セキュリティ保護のため、コンピュータにアクセスできる アクティブ コンテンツは表示されないよう、Internet Explorerで制限さ れています。オプションを表示するにはここをクリックしてください...」 の行をクリックし、「ブロックされているコンテンツを許可」をクリック します。 「セキュリティの警告」ウインドウが表示されたら、「はい」ボタンをク リックします。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ★ホームページ: http://www.flsi.co.jp/Java_text/ ★このメールマガジンは 「まぐまぐ(http://www.mag2.com)」 を利用して発行しています。 ★バックナンバーは http://www.flsi.co.jp/Java_text/ にあります。 ★このメールマガジンの登録/解除は下記Webページでできます。 http://www.mag2.com/m/0000193915.html ★このメールマガジンへの質問は下記Webページにて受け付けて います。わからない所がありましたら、どしどしと質問をお寄 せください。 http://www.flsi.co.jp/Java_text/ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ Copyright (C) 2007 Future Lifestyle Inc. 不許無断複製 |