import java.awt.*; import java.util.*; /** * このスレッドは, 画面下部に ticker を表示します. * TickerMaker が作成した ticker イメージを, 右から左にスクロールするだけです. *
* TickerMaker が新しいイメージを作成した旨の通知があると, * スクロールするイメージを置き換えます. * ただし, スクロールしきるまでは, イメージの長さの変更は関知されません. * * @author Kawaguchi Koji * @version 1.0 * * @see TickerMaker */ class TickerThread extends Thread implements Observer { /** * スクロールの現在位置 */ int x, y; /** * Fnaviクラス */ Fnavi fnavi; /** * ticker表示エリアの左上座標 */ Point lefttop; /** * ticker表示エリアの大きさ */ Dimension scrsize; /** * ticker表示エリアのグラフィックコンテキスト */ Graphics scrgraphics; /** * tickerのフォント */ Font font; /** * TickerMakerによって作成された, tickerのイメージ */ Image tickimage; /** * TickerMakerのインスタンス */ Thread tmh = null; /** * コンストラクタは, パラメータをインスタンス変数にセットします. * * @param fnavi Fnaviクラスのインスタンス * @param lefttop Ticker表示領域の左上座標 * @param scrsize Ticker表示領域の大きさ * @param font Ticker表示用のフォント * @param g Ticker表示用のグラフィック・コンテキスト */ TickerThread(Fnavi fnavi, Point lefttop, Dimension scrsize, Font font, Graphics scrgraphics) { this.fnavi = fnavi; this.scrsize = scrsize; this.lefttop = lefttop; this.font = font; this.scrgraphics = scrgraphics; } /** * ticker 表示処理のメインです. * 新しい ticker を作成して、それを1画面分スクロールさせる. * という処理の繰り返しです. */ public void run() { for (;;) { // 新しい文字列でイメージを作る String str1 = ""; // 前半部 String str2 = fnavi.getLogoFlying() ? "" : " [Flashnavi]"; // 後半部 TickerMaker tm = new TickerMaker(fnavi, scrgraphics, font, scrsize.width); tm.addObserver(this); tm.setHeadFoot(str1, str2); tmh = new Thread(tm); tmh.start(); int lx = tm.getImageWidth(); int x = lx + scrsize.width; // 文字の左右の空白部分 // スクロール while (x >= 0) { if (tickimage != null) { scrgraphics.drawImage(tickimage, x - (lx + scrsize.width), lefttop.y, null); // fnavi.o("tickimage"); // scrgraphics.setColor(Color.green); // scrgraphics.clearRect(x-lx, lefttop.y, scrsize.width, scrsize.height); fnavi.redraw(); } try { sleep(50); } catch (InterruptedException e) {} x--; } // スクロールし終わったらもう用は無い tmh.stop(); } } /** * TickerMaker クラスよりの更新通知です. * * @param o 通知元クラス * @param arg 通知パラメータ * * @see java.util.Observer */ public void update(Observable o, Object arg) { tickimage = (Image) arg; } /** * ticker 用エリアサイズを返します. * * @return エリアサイズ */ Dimension getRect() { return scrsize; } /** * 使用中の TickerMaker スレッドを停止します. * TickerThread を stop する前に呼び出してください. */ void tostop() { if (tmh != null) { tmh.stop(); } } }