広告

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
                      2012年09月29日

   Java総合講座 - 初心者から達人へのパスポート
                 2009年11月開講コース 063号

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■


-------------------------------------------------------
・現在、このメールマガジンは以下の2部構成になっています。
[1] 当初からのコース:vol.xxx(xxxは番号)が振られています。
   これは現在、中級レベルになっています。
[2] 2009年11月開講コース:xxx号(xxxは番号)が振られています。
   これは現在、初心者向けのレベルになっています。
・このメールマガジンは、画面を最大化して見てください。
小さな画面で見ていると、不適切な位置で行が切れてしまう
など、問題を起すことがあります。
・このメールマガジンに掲載されているソース・コード及び
文章は特に断らない限り、すべて筆者が著作権を所有してい
ます。また、これらのソース・コードは学習用のためだけに
提供しているものです。
-------------------------------------------------------


========================================================
◆ 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 - 10, getCenterY() - radius - 10, 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で割っ
た計算後の数値です。
このように、プログラミングの前に計算しておけば済むものは予め計算し
ておいて、その計算結果の数値をプログラムの中に組み込めば、無駄なCPU
の使用を削減できます(実は、JavaではMath.PIのような定数や数のリテ
ラルを使った計算はコンパイル時に行われ、実行時にその計算にCPUを
使用することはないのでほとんど考慮する必要はないのですが、他の言語
を使う場合のためにこのような習慣をつけておいたほうが効率はよいで
しょう)。

上記のソース・コードの中で初登場したdrawString()というメソッドは、
Graphicsのメソッドで、グラフィックスに文字列を書き込むためのメソッ
ドです。
第一引数には書き込みたい文字列を指定し、第二引数には、書き込みを
開始する位置のx座標、第三引数には書き込みを開始する位置のy座標を
指定します。
なお、必要ならばdrawString()メソッドを呼び出す前にsetFont()メソッ
ドを使ってフォント(の種類やサイズなど)を指定することができます。
詳しくはAPI仕様などで調べてください。

また、drawOval()、fillOval()はともに楕円を描くためのメソッド(この
うちfillOval()は内部を塗りつぶす)ですが、縦と横を同じサイズにする
と、円になります。
(今回は線の幅を太くしているので、drawOval()で描いても塗りつぶして
いるかのように見えます。)



それでは、続いて、このClockPictureを使って時計を表示するためのパネル
を作りましょう。ClockJPanelというクラス名にします。

(1) パッケージ・エクスプローラーの中のJStudy1のsrc配下の
jp.co.flsi.lecture.clock
を右クリックし、「新規」→「その他」を選択します。

(2) 「新規」ウインドウにおい「WindowBuilder」配下の
「Swing Designer」配下の「JPanel」を選択し、「次へ」ボタンを
クリックします。

(3)  「ソース・フォルダー」に「JStudy1/src」が入力されていること
を確認し、「パッケージ」がjp.co.flsi.lecture.clockになっていること
を確認し、「名前」の欄に

ClockJPanel

と入力しましょう。

(4) 「スーパークラス」が「javax.swing.JPanel」になっていることを確認し、
「完了」ボタンをクリックします。


ClockJPanel.javaのエディターが開きましたら、まず最初にパネルのサイズを
変更しておきましょう。
すなわち、ClockJPanel()コンストラクターの中に
--------------------------------------------------------
setSize(160, 200);
--------------------------------------------------------
という行を挿入して、全体としては
--------------------------------------------------------
public ClockJPanel() {
   setSize(160, 200);
}
--------------------------------------------------------
に変更します。(このコードは必須ではありませんが、これがないと後で
ClockJPanelだけを単独でテスト実行するときに画面が潰れてしまって不便
です。手で画面を広げてやれば済む話ではありますが、コードを書く習慣
をつけておくと、後で役に立つでしょう。)


次に、Designビューを開いて(エディターの画面は最大化しておきましょう)、
このClockJPanelにClockPictureを組み込むことにしましょう。

Palette(パレット)からSystem配下の「Choose component」(コーヒー豆のアイコン)
を選択し、「型を開く」ウインドウにおいて
ClockPicture
と入力して「OK」ボタンをクリックし、パネルの画像の外側
の白いところ(空白のエリア)をクリックすることによって貼りつけます。

そうするとソース・コード上に
   private final ClockPicture clockPicture = new ClockPicture();
という行が自動的に生成されますね。Sourceビューを開いて確認して下さい。
(直接手でコードを書き込んでも同じことですが、このようにビジュアルな操作
でもできるということも覚えておきましょう。)

このclockPictureフィールドを使えば、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);
   clockPicture.setCurrentTime(newTime);
   clockPicture.drawAll(g2dImage);
   g.drawImage(image, 0, 0, 170, 200, null); }
--------------------------------------------------------

(これらのコードをそのまま入力するだけだと、例によってimport文が無い
ためにエラー(赤色の下線がつく)になるクラスなどがありますから、いつ
ものようにコンテンツ・アシストの機能でimport文を自動追加して下さい。)

このメソッドは、コンピューターの内蔵時計から現在時刻を取り出し
(「new GregorianCalendar()」でGregorianCalendarのインスタンスを
生成すると現在時刻を持ったインスタンスが作られる)、それから、
本日の日付や現在時刻を文字列で描き出しています。その後、ClockPicture
のインスタンスに現在時刻をセットして時計を描画させています。
ここでもやはり、以前説明したオフスクリーン描画イメージ(055号参照)
を使用していることはおわかりですね。

さきほどのrun()メソッドのループで100ミリ秒おきにrepaint()を実行し
ていますから、このpaint()メソッドは100ミリ秒おきに繰り返し呼び出さ
れることになります。

秒針は1秒ごとに動きますから、1秒おきに呼び出せばいいのでは、と思う
かもしれませんが、そうすると、タイミングが悪ければ秒針の動きが最大1秒
遅れてしまう可能性もあります。
したがって、もっと細かい間隔で呼び出したほうがいいのです。
でもあまり細かく(たとえば1ミリ秒ごとに)呼び出してしまうと、その分
よけいにCPUを使ってしまうことになるので、あまり細かくしすぎるのも好ま
しくありません。
100ミリ秒おき〜200ミリ秒おき程度の間隔が望ましいでしょう。

さて、できあがったClockJPanelがどのように時計を表示するのか確認したい
場合は、パッケージ・エクスプローラーのClockJPanelを右クリックし、
「実行」→「Java Bean」を選択すれば見られます。ただし、paint()メソッド
が呼び出されるだけであり、clockStart()メソッドを呼び出しているわけでは
ないので、時計は動きません。



では、続いて、このClockJPanelを使って時計を動かして表示するためのアプ
レットを作りましょう。ClockAppletというクラス名にします。


(1) パッケージ・エクスプローラーの中のJStudy1のsrc配下の
jp.co.flsi.lecture.clock
を右クリックし、「新規」→「その他」を選択します。

(2) 「新規」ウインドウにおい「WindowBuilder」配下の
「Swing Designer」配下の「JApplet」を選択し、「次へ」ボタンを
クリックします。

(3)  「ソース・フォルダー」に「JStudy1/src」が入力されていること
を確認し、「パッケージ」がjp.co.flsi.lecture.clockになっていること
を確認し、「名前」の欄に

ClockApplet

と入力しましょう。

(4) 「スーパークラス」が「javax.swing.JApplet」になっていることを確認し、
「完了」ボタンをクリックします。


では、このClockAppletのDesignビューを開いて、まず最初にアプレットの中の
レイアウト・マネジャーをnullにしておきましょう。
すなわち、アプレットの画像の中を右クリックし、「Set Layout」→
「Absolute layout」を選択します。
また、同パネルの背景(background)を白色にしておきましょう。アプレット
の画像の中をクリックして選択状態にし、Properties欄のbackgroundプロパティー
の値をWHITE(「...」ボタンをクリックして「Color chooser」ウインドウ内の
「AWT colors」タブで「WHITE」を選択し「OK」ボタンをクリック)にしておき
ましょう。

続いて、このアプレットにClockJPanelを貼り付けることにしましょう。
PaletteからSystem配下の「Choose component」を選択し、「型を開く」ウインドウ
において
ClockJPanel
を入力して「OK」ボタンをクリックし、アプレットの画像の中に
貼り付け(クリック)してください。

そうするとソース・コードのClockApplet()コンストラクターの中に
--------------------------------------------------------
ClockJPanel clockJPanel = new ClockJPanel(); clockJPanel.setBounds(168, 174, 10, 10); getContentPane().add(clockJPanel);
--------------------------------------------------------
というようなコードが自動的に追加されますね。
このコードの中の
--------------------------------------------------------
clockJPanel.setBounds(168, 174, 10, 10);
--------------------------------------------------------
という行(数字は貼り付け位置によって異なります)を
--------------------------------------------------------
clockJPanel.setBounds(0, 0, 160, 200);
--------------------------------------------------------
のように書き換えましょう。

これで、ClockJPanelがアプレットの左側にぴったりときれいに張り付きましたね。
(パッケージ・エクスプローラーにおいて、ClockApplet.javaを右クリック
→「実行」→「Javaアプレット」を選択して確認してください。)
(アプレットの右側のあいている空間は後でアラームの機能などに使用します。)

また、
--------------------------------------------------------
ClockJPanel clockJPanel = new ClockJPanel();
--------------------------------------------------------
という行、すなわち、clockJPanelという変数は、他のメソッドから
も参照できるようにしたいので、フィールドに変換しておきましょう。
変数のclockJPanelの中にカーソルを入れておいて、メニュー・バー
の「リファクタリング」→「ローカル変数をフィールドに変換」を選択
して下さい。
続いて、「ローカル変数をフィールドに変換」ウインドウでそのまま
「OK」ボタンをクリックします。


では次に、このClockAppletが起動されたら時計が動き出すように、プログラミ
ングしましょう。
次のようなinit()メソッドを追加して下さい。
--------------------------------------------------------
public void init() {
   this.setSize(300, 200);
   this.setContentPane(getContentPane());
   clockJPanel.clockStart();
}
--------------------------------------------------------

最後に、このClockAppletが終了するときに時計も停止されるように、プログラ
ミングしましょう。
ClockAppletのソース・コードの最後にでも次のようなメソッドを追加してくだ
さい。
--------------------------------------------------------
public void destroy() {
   clockJPanel.clockStop();
}
--------------------------------------------------------

init()メソッドやdestroy()メソッドが何だったか忘れた人は056号を復習して
ください。


では、保管したあと、ClockAppletを実行してテストしてみてください。
ちゃんと時計が動きますね。

ところで、時計を動かすためになぜマルチスレッドにする必要があったのか
というと、もしシングルスレッドにしてしまうと、時計を動かすためのwhile
ループだけがいつまでも実行し続ける状態になってしまって、このソフトの他
の機能が動かなくなってしまうからです。

一般に、GUIのプログラムでは、ループなどの長時間を要する処理は別のスレッ
ド(マルチスレッド)で実行する必要があります。もしシングルスレッドにして
しまうと、ループ以外の処理が実行できなくなり、メニューを操作したり、ボタ
ンをクリックしても何も反応してくれないという状態(いわゆる「固まってしま
う」という状態)になってしまいます。

そのために今回のプログラムでは、時計を動かすためのwhileループを
(ClockJPanelの)run()メソッドの中に作って、別のスレッドで実行するように
しているのです。



では、今回はここまでにします。なお、今回作成したアプレットはホームページ
にも掲載しておきますので、正しく作成されたアプレットの動きを確認したい人
は下記ホームページの063号の項目から実行してみてください。

http://www.flsi.co.jp/Java_text/

何か、わからないところがありましたら、下記のWebページまで質問をお寄せ
ください。


(続く)



========================================================
◆ 02.文法解説 [アプレット(4)「アプレットの起動」]
========================================================

[アプレット(4)「アプレットの起動」]

完成したアプレットは通常、関連するファイル(参照しているクラスのファイル
や使用する画像ファイル、音声ファイルなど)といっしょにJARファイルにして
からWebサーバー(インターネットの世界でWebページを提供するコンピューター)
に入れておきます。
(Webサーバーについては別の機会に詳しく説明します。)


053号でも紹介しましたが、JARファイルは以下のようにしてEclipseの
エクスポート機能で作成することができます。


例として、今回作成したClockAppletを実行するためのJARファイルを作成す
ることにしましょう。

(1) パッケージ・エクスプローラーの中のJStudy1のsrc配下の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)で実行します。

057号でお話したように、アプレットにはパラメーターを指定することもでき
ますが、その場合には以下のように「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タグの代わりに下記のようなHTMLを使うこともあります。
(なるべくAPPLETタグを使うべきですが、念のために下記のような方法があるという
ことも頭の片隅にでも入れておくとよいでしょう。)
--------------------------------------------------------
<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
といった記述が必要になります。)

なお、上記のHTMLは、見ての通り、JRE 1.5.0を使っている場合のものです。
アプレットが別のJavaのバージョンで開発された場合は、別のバージョンを
指定します。
(JRE(Java Runtime Environment)は大雑把にはJVMのことと思えばよいが、詳し
く言うとJVMに加えて基本的なAPIなど、プログラムの実行環境として不可欠なファ
イルを含むものである。これらはバージョンによって少し異なるため、アプレッ
ト開発時のJavaのバージョンに合わせておかないと問題がおこることがある。
特に新しいアプレットを古いバージョンのJavaで動かそうとすると動かないこと
がある。)


このHTMLを使うと、Webブラウザーに該当するJVMが組み込まれていない場合は
該当するJVMがjava.sun.comからダウンロードされてWebブラウザーに組み込ま
れ(インストールされ)ます。
このようにWebブラウザーに組み込まれて使用されるJVMを「Javaプラグイン
(Java Plug-in )」と呼びます。

該当する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についての知識がある人は、APPLETタグの働きを自分で確認して
みて下さい。
今回作成したアプレットを上記の[アプレットの起動]のHTMLの例を
使って実行してみましょう。

なお、Internet Explorerの設定によっては、実行するプログラムが
安全であるかないかに関わらず、警告を発するようになっています。
そのため、Internet Explorerが「情報バーにお気づきですか?・・・・」
(注:Internet Explorerのバージョンによって、これとは異なる表示、
あるいは英語で表示されることもあります)のウインドウを表示すること
がありますが、そのときは、「OK」ボタンをクリックし、「セキュリティ
保護のため、コンピュータにアクセスできるアクティブ コンテンツは表示
されないよう、Internet Explorerで制限されています。オプションを表示
するにはここをクリックしてください...」の行をクリックし、「ブロック
されているコンテンツを許可」をクリックします。
「セキュリティの警告」ウインドウが表示されたら、「はい」ボタンをク
リックします。
(注: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) 2012 Future Lifestyle Inc. 不許無断複製