スレッドを使ったアプレット

スレッドという機能を使うとプログラムの実行を休止したり、複数のメソッドを同時実行できるようになります。

使用例1 1秒間に1個ずつランダムに円を描く

スレッドを使って1秒間に1個ずつランダムは大きさ、位置、色の円を描くプログラムです。

// 1秒間に1個ずつランダムな大きさと色の円を描く
import java.applet.*;
import java.awt.*;


// <applet code="ap_thread_oval" width="300" height="300"></applet>

public class ap_thread_oval extends Applet implements Runnable {
  Thread t;

  public void init() {
  // スレッドの開始
    t = new Thread(this);
    t.start();
  }

  public void run() {
    try {
      while(true){
// 再描画要求
        repaint();
// 1000ミリ秒(1秒)休止する
        Thread.sleep(1000);
      }
    }
    catch (Exception e){
    }
  }

// 描画の更新 オーバーライドすることでアプレット全体の表示消去を抑止する
  public void update(Graphics g){
    paint(g);
  }
  
  public void paint(Graphics g){
// アプレットのサイズを取得
    Dimension d = getSize();

// 円の中心、半径、色を乱数で作成
    int x = (int)(Math.random() * d.width);
    int y = (int)(Math.random() * d.height);
    int r = (int)(Math.random() * d.width / 2);
    int R = (int)(Math.random() * 255);
    int G = (int)(Math.random() * 255);
    int B = (int)(Math.random() * 255);

// 色の設定
    setBackground(new Color(10, 10, 10));
g.setColor(new Color(R, G, B)); // 円の描画 g.drawOval(x - r, y - r, 2 * r, 2 * r); } }

実行例

使用例2 デジタル時計

スレッドを使い、1秒おきに日付と時間を取得し、表示しています。

// デジタル時計アプレット
import java.applet.*;
import java.awt.*;
import java.util.*;


// <applet code="ap_thread_clock" width="300" height="150"></applet>

public class ap_thread_clock extends Applet implements Runnable {
  Thread t;
  
  public void init() {
  // スレッドの開始
    t = new Thread(this);
    t.start();
  }
  
  public void run() {
    try{
      while (true) {
  // 再描画要求
        repaint();
  // 1000ミリ秒間の休止
        t.sleep(1000);
      }
    }
    catch (Exception e){
    }
  }
  
  public void paint(Graphics g){
    int Year, Month, Date, Hour, Minute, Second, AMPM;
    String S_AMPM;
 
    Calendar C = Calendar.getInstance();
    Year = C.get(C.YEAR);
    Month = C.get(C.MONTH) + 1;
    Date = C.get(C.DATE);
    AMPM = C.get(C.AM_PM);
    Hour = C.get(C.HOUR);
    Minute = C.get(C.MINUTE);
    Second = C.get(C.SECOND);

    if(AMPM == C.AM) {
      S_AMPM = "AM ";
    } else {
      S_AMPM = "PM ";
    }

    setBackground(Color.white);
    g.setFont(new Font("Serif", Font.BOLD, 36));
    g.drawString(Year + "/" + Month + "/" + Date, 10, 40);
    g.drawString(S_AMPM + Hour + ":" + Minute + ":" + Second, 10, 80);
  }
}

実行例