カラフル文字列の描画


1文字ずつ色を変え,さらに赤色表示の文字を1文字づつ移動していく。 ここにJava Appletが挿入されています

ソースコード

import java.applet.*;
import java.awt.*;

public class ja06 extends Applet implements Runnable
{
  Thread th = null;				//スレッドの定義
  String s = "Welcome!KodayanHomepage";		//マーキーに表示する文字列
    int slength;				//文字列の文字数
    char sa[];			  //文字列を配列に格納する(1文字づつ表示するため)
    int redc = 0;		  //赤色表示する文字を識別する
    Color c[] = {Color.pink,Color.white,Color.orange,Color.yellow,Color.green,Color.blue,
					Color.magenta};		//7色を配列に格納

  public void init()
  {
    slength = s.length();		//文字列の文字数を取得
    sa = new char[slength];		//文字配列の生成
    s.getChars(0,slength,sa,0);		//文字列sを配列に格納する。
  }

  public void paint(Graphics g)
  {
    Font f=new Font("TimesRoman",Font.BOLD,24);	  //フォントの設定
    g.setFont(f);
    FontMetrics fm = g.getFontMetrics(); //フォント情報を得るためのFontMetoricオブジェクト
    int sw = fm.stringWidth(s);		//文字列の横幅をピクセル値で取得
    int sh = fm.getHeight();		//フォントの高さを取得
    int x = 10;				//文字を描画する開始位置のx座標
    int ci = 0;				//カラー配列のIndex番号
    g.setColor(Color.black);
    g.fillRect(x-2,20,sw+20,sh+2);	//黒で塗り潰した四角形の描画
		
    for(int i = 0;i < slength;i++,ci++)
    {
	if(i ==redc){
	   g.setColor(Color.red);
	}
	else{
	   if(ci == 7) ci = 0;			//カラー配列の最後に達したら,先頭に戻す
	   g.setColor(c[ci]);			//カラー配列の順番に従い色を設定
	}
	   g.drawChars(sa,i,1,x,20 + sh);	//配列内の指定文字を描画する
	   x += fm.charWidth(sa[i]);		//描画位置のx座標を,文字幅分移動する
	}
    }

  public void start()				//スレッドの実行
  {
    if (th == null){
	th = new Thread(this);		//Threadオブジェクトの作成。
	th.start();		//Threadクラスのstart()メソッドが呼び出され,スレッドを開始する。
				//そしてアプレット内に定義されたrun()メソッドが呼び出される。
    }
  }
	
  public void run()
  {
    while (true)
    {
	repaint();		  //paint()メソッドを呼び出し,内容を常時更新。
	if(++redc == slength){	  //赤色が文字列の最後に達したら
	  redc = 0;		  //リセットする(先頭の文字を赤色に)
	}
	else{
	  redc++;		  //redcを1増加
	}
			
	try{
	  Thread.sleep(500);	  //スレッド間隔を0.5秒に
	}
	catch (InterruptedException e){
	  stop();
	}
    }
  }
}

末尾