import java.awt.*; import java.util.*; /** * このクラスは, ticker をイメージとして作成します. *
* 時刻については, 常に更新します. 更新されると, observer に通知します.
* それ以外の情報については, インスタンスの生成以降に変更があっても,
* 表示には反映されません.
*
* @author Kawaguchi Koji
* @version 1.0
*
* @see TickerThread
*/
class TickerMaker extends Observable implements Runnable {
/**
* Fnaviクラス
*/
Fnavi fnavi;
/**
* ヘッダ文字列
*/
String head;
/**
* フッタ文字列
*/
String foot;
/**
* tickerのフォント
*/
Font font;
/**
* font
のフォント情報
*/
FontMetrics fm;
/**
* スクリーンの横幅
*/
int scrwidth;
/**
* コンストラクタは, パラメータをインスタンス変数にセットします.
*
* @param fnavi Fnaviクラスのインスタンス
* @param g Ticker表示用のグラフィック・コンテキスト
* @param font Ticker表示用のフォント
* @param width スクリーンの横幅
*/
TickerMaker(Fnavi fnavi, Graphics g, Font font, int width) {
this.fnavi = fnavi;
this.head = null;
this.foot = null;
this.font = font;
this.scrwidth = width;
fm = g.getFontMetrics(font);
}
/**
* tickerのヘッダとフッタをセットします.
*
* @param head ヘッダ文字列
* @param foot フッタ文字列
*/
void setHeadFoot(String head, String foot) {
this.head = head;
this.foot = foot;
}
/**
* tickerの長さをピクセル数で返します.
*
* @return 長さのピクセル数
*/
int getImageWidth() {
return fm.stringWidth(head + makeDateTime() + foot);
}
/**
* ticker イメージの作成, 更新を行います.
* 1秒ごとに, 新しいイメージに更新するために, オブザーバーに通知します.
*/
public void run() {
String lastlabel = "";
for (;;) {
String label = head + makeDateTime() + foot;
if (label.compareTo(lastlabel) != 0) {
// 新しいイメージを作成
Image im = fnavi.createImage(fm.stringWidth(label) + scrwidth * 2, fm.getHeight());
Graphics ig = im.getGraphics();
// fnavi.o(im+","+ig);
ig.setColor(Color.black);
ig.fillRect(0, 0, fm.stringWidth(label) + scrwidth * 2, fm.getHeight());
ig.setColor(Color.white);
ig.setFont(font);
ig.drawString(label, scrwidth /*fm.stringWidth(label)*/, fm.getAscent());
// 更新通知
setChanged();
notifyObservers(im);
}
// 0.25秒待つ
try {
Thread.sleep(250);
}
catch (InterruptedException e) {}
}
}
/**
* 数値を2桁の文字列に変換します.
* 数値が1桁の場合, 頭に 0 が付きます.
*
* BASICの print using "##", n
のイメージです.
*
* @param n 変換したい数値
* @return 2桁化した数値の文字列
*/
String using2(int n) {
if (n < 10) {
return "0" + n;
}
else {
return "" + n;
}
}
/**
* 現在時刻を文字列にして返します.
*
* @return 現在時刻文字列で,「1997/01/23(水) 04:56:07」という形式です.
*/
String makeDateTime() {
String youbi[] = {"日", "月", "火", "水", "木", "金", "土"};
Date d = new Date();
String s = (d.getYear() + 1900) + "/" + using2(d.getMonth() + 1) + "/" + using2(d.getDate()) + "(" + youbi[d.getDay()] + ") " + using2(d.getHours()) + ":" + using2(d.getMinutes()) + ":" + using2(d.getSeconds());
return s;
}
}