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; } }