countdownの改良アイデアとヒント

   2012/05/29

こんにちは、管理人イガジーです。

昨日までで countdownプログラムは一区切りつけた(つもり)ですが
プログラミングは「自分の思うように(望むように)プログラムを動かす」ところに
面白さがあります。

でも、最初のうちは、何ができるのか、どこまで可能か、などが見えないので
「好きなように改造してください」と言われても困ってしまうかもしれません。

そこで、比較的簡単にできる改良(課題)と、そのヒントを書いておきます。
もちろん、実現方法はひとつとは限りません。

課題は次の3つ
(a)分単位(60秒間隔)で更新する際に、更新遅延を少なくする

(b)残り日数が7日以上であれば、背景色を緑にする。
(7日を切ると、黄色背景にする)

(c)「今日はxxxx年xx月xx日」の後ろに「曜日」を追加する
(例えば”今日は2011年11月8日(火)”など)

ヒントは次のとおりです。

(a)更新遅延を少なくする
分単位の更新をするのに、タイマーの周期を60000にすると、プログラムの
起動タイミングによって、毎分25秒に更新されたり、毎分50秒に更新されたりします。

周期を1秒(1000)にしてチェックし、分の変化がなければ何もせずに抜ける
のもひとつの手ですが、
起動時の秒数を調べて、「60秒-その秒」ぶんをタイマースタートの遅延として
tmr.schedule(new DoCount(), スタート遅延, 60000);に設定するのが効率的です。
つまり、起動時刻(cms)が xx分25秒であれば、35秒の開始遅延
xx分50秒であれば、10秒の開始遅延をセットするのです。
(計算式にすると、60000-(cms%60000) になります)

(b)現状の背景色処理は

if (st>0) rest.setBackground(Color.YELLOW);
else rest.setBackground(Color.RED);

で、正ならば黄色、負なら(過ぎてしまったら)赤です。
これに条件(if文)を追加して

if (残り日数>6 ) rest.setBackground(Color.GREEN);
else if (st>0) rest.setBackground(Color.YELLOW);
else rest.setBackground(Color.RED);

とすれば良いでしょう。

(c)曜日は、int dow=c.get(Calendar.DAY_OF_WEEK);で1〜7の数値が得られます。
1が日曜(sun)で、2が月曜(mon)、7が土曜(sat)です。
本当は、日曜が1である保証はないので、Calendar.SUNDAY 等を使うべき
なのですが、個人的なプログラムなら「1=日曜決め打ち」でも問題ないでしょう。

final String wn[]={
	"日","月","火","水","木","金","土"
 //	"sun","mon","tue","wed","thu","fri","sat"
};

という配列を用意して、wn[dow-1]で曜日の文字列が得られます。

もうひとつの方法として、String.formatの代わりに
SimpleDateFormat sdf=new SimpleDateFormat("今日はyyyy年M月d日(E)");を使う手もあります。
new SimpleDateFormat()で、フォーマット(※)を定義しておき、
String td=sdf.format(c.getTime()); で文字列を得ます。
※ E が曜日、yyyy が4桁の年、M が月、d が日にちを表します。

ソースコードがあれば、この様にちょいちょいと改造ができるのです。
プログラミングを楽しんでください。

countdownプログラムを作ってみよう1
countdownプログラムを作ってみよう2
countdownプログラムを作ってみよう3
countdownプログラムを作ってみよう4
countdownプログラムを作ってみよう5
countdownプログラムを作ってみよう6

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)