カレンダ時計

  1. カレンダ時計

    スレッドを利用して日付と時刻を表示します。

  2. 手法

    1. 日付と時刻情報の取得

      日付と時刻情報の取得はDateクラスを利用します。
       Date w_date;
       w_date = new Date();
      で、w_dateに日付と時刻情報が取得できます。Dateを利用するには、先頭に
             import java.util.*;
      が必要です。

  3. スレッド

    1. スレッドの役割

      時刻を更新するには、一定時間間隔で表示を更新する必要があります。しかし、次の1秒間描画変化するまで繰り返しループで待つのは、プロセッサの無駄です。本体とは別に並列処理するプログラム:スレッド を起動し、そこから、定期的に「描き直し」のイベントを出すことにします。

    2. スレッドの組み込み

      アプレットでスレッドを組み込むには、インターフェースを利用します。先頭の
       public class digwatch extends Applet
      に続けて次のように implements Runnable を付加します。これで、スレッド機能が利用できるようになります。 
       public class digwatch extends Applet implements Runnable
      次に、先頭でスレッドの宣言をします。クラス宣言の次に
       Thread w_clock ;
      を追加します。

    3. スレッドの起動

      init()メソッドの最後で、スレッドを生成し起動します。スレッドの生成は
            w_clock = new Thread(this);
      です。thisは自分(この場合、Applet1クラス)の意味でスレッドを生成したオブジェクトを知らせます。スレッドを起動するのは start() メソッドを実行する必要があります。
           w_clock.start();
      で、スレッドが実行を開始します。
      public void init() {
       try {
       jbInit();
       }
       catch(Exception e) {
       e.printStackTrace();
       }
      
        //スレッドの起動
        w_clock = new Thread(this);
        w_clock.start();
       }

    4. run()

       スレッドのstart()で、 run() メソッド が起動します。このrun()メソッドが、他のプロセスと並列に実行されます。run()ではまず、repaint()で再描画を要求し、sleep(1000)で1000m秒休止します。休止後再び、repaint() で再描画を要求します。これで、時計の表示が更新されます。
       このスレッドは1秒間に1度repaint()を出すだけで、他の時間はお休み(sleep)しています。本体のアプレットも、1秒に一度表示をするだけで、他は何もすることがないので、開店休業状態です。
       なお、Thread.sleep(1000); の外側の try と catch は、エラー処理を行う仕掛けです。ここでは、特にエラー処理をしていませんが、一部のメソッドではこのエラー処理がないと、「try節がありません」とコンパイラーが注意をします。
      public void run() {
      while (true) {
      // 再描画
       repaint();
       try
       {
        Thread.sleep(1000);
        }
       catch(Exception e) { }
      }

  4. プロジェクト


    1. プロジェクトの作成

      JDKを利用する場合は、以下のプログラムを直接エディタで入力し digwatch.java を作成して下さい。関数の中身は、続く「プログラム」の項を参照してください。
      import java.awt.*;
      import java.awt.event.*;
      import java.applet.*;
      import java.util.*;
      
      public class digwatch extends Applet implements Runnable
      {
      
        Thread w_clock = null;
        Date w_date;
      
        /**アプレットの初期化*/
        public void init() {
        ...}
      
        public void paint(Graphics g) {
        ...}
      
        public void run() {
        ...}

    2. プログラム

      1. init():初期設定されるメソッド(関数)
        アプレットでは、ブラウザから起動されるとき、最初に初期化する関数 init() を呼び出します。このメソッドで、後から説明するスレッドを起動します。

      2. paint():表示
        これは、アプレットの画面に表示を行う関数です。GUI部品以外はこのpaint()で描画します。ここでは、時刻情報を取得し、表示します。まず、背景をdarkGrayに設定し、
         g.fillRect(0,0,240,60)
        で塗りつぶしておきます。gはアプレットから引き渡されるグラフィックスのクラスインスタンスです。また、240,60 は背景のサイズです。
         次に、表示の文字の色をgreenとし、g.drawString(w_date.toString(), 10, 30); で、時刻の文字w_dateを(10,30)の位置から表示します。グラフィックの詳細は、別のプログラムで説明します。

        public void paint(Graphics g) {
         Date w_date;
         w_date = new Date();
         g.setColor(Color.darkGray);
         g.fillRect(0,0,240,60); //背景を塗る
         g.setColor(Color.green);// 緑色でテキストの色を設定
         w_date = new Date();
         g.drawString(w_date.toString(), 10, 30);
        }

    3. ソース

      ここに digwatch.java のソースをまとめます。

  5. 実行

    1. コンパイル

      digwatch.java をコンパイルして digwatch.class を作成します。
      「Dateクラスが見つかりません」のエラーがでる場合、先頭の
        import java.util.*;
      を確認してください。

    2. アプレットを表示するページ

      以下の html ファイルを作成し、digwatch.html とします。
      <HTML>
      <HEAD>
      <TITLE>
      HTML テストページ
      </TITLE>
      </HEAD>
      <BODY>
      ディジタルカレンダ時計です。<BR>
      <APPLET
        CODEBASE = "."  CODE  = "digwatch.class"
        NAME     = "TestApplet"  WIDTH  =230  HEIGHT = 60 > </APPLET>
      </BODY>
      </HTML>

    3. 実行例

      digwatch.htmlをブラウザで実行します。実行例を示します。



トップに戻る