countdownプログラムを作ってみよう3
まいど、管理人イガジーです。
プログラムを作っていく方法(開発手法)には、
(a)作る前に仕様を決めて、その通りに作っていく方法(ウォーターフォール)
と
(b)中核部分から作り、改良・機能追加・仕様変更してゆく方法(スパイラル)
の2通りがあります。
ソフトを請け負って開発する様な場合は、通常(a)のウォータフォールです。
そうしないと、何をもって開発完了なのかがあいまいになり、
ずるずると開発期間が伸びてしまうからです。
個人での(趣味)プログラミングは、(b)のスパイラルになる事が多いです。
作ってみると最初に考えた形では使い勝手が悪いとなると、改良しますし
使ってみるとこんな機能も欲しい、と欲が出てきます。
良い物になってゆく可能性はありますが、欠点としてはプログラム(コード)が
継ぎ足し、つぎはぎで汚く(分かりにくく)なったり、仕様の矛盾が起きたりします(※)。
しかし、管理人イガジーとしては、(b)を勧めます。途中で力尽きても、その時点で
動くものはできていますから。
(※もちろん(a)の手法でも、設計時には気づかなかった仕様矛盾が起きる可能性はあります)
さて、昨日の続きです。
カウトダウンプログラムの見栄えを良くした例を示しましょう。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Label;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class CountDown {
final long MS2HOUR=1000*60*60;
Calendar c,d;
CountDown() { // constructor
Frame f=new Frame();
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev) {
System.exit(0);
}
});
f.setSize(300,200);
f.setTitle("CountDown");
Font f1=new Font("SansSerif",Font.PLAIN,20);
c=new GregorianCalendar();
int cyy=c.get(Calendar.YEAR);
int cmm =c.get(Calendar.MONTH);
int cdd =c.get(Calendar.DAY_OF_MONTH);
long ms=c.getTimeInMillis();
String td=String.format("今日は %d年 %d月 %d日", cyy,cmm+1,cdd);
Label today=new Label(td);
today.setFont(f1);
today.setAlignment(Label.CENTER);
f.add(today, BorderLayout.SOUTH);
Label target=new Label("今年は");
target.setFont(f1);
target.setAlignment(Label.CENTER);
f.add(target, BorderLayout.NORTH);
Label ll=new Label("あと");
ll.setFont(f1);
f.add(ll, BorderLayout.WEST);
f.add(target, BorderLayout.NORTH);
Label rr=new Label("日");
rr.setFont(f1);
f.add(rr, BorderLayout.EAST);
d=new GregorianCalendar(cyy+1,0,1);
long mst=d.getTimeInMillis()-ms;
int hh=(int)(mst/MS2HOUR);
int dd=hh/24;
String rd=Integer.toString(dd);
Label rest=new Label(rd);
rest.setBackground(Color.YELLOW);
rest.setFont(new Font("SansSerif",Font.PLAIN,72));
rest.setAlignment(Label.CENTER);
f.add(rest, BorderLayout.CENTER);
f.setVisible(true);
}
public static void main(String[] args) {
new CountDown();
}
}
BorderLayout(辺配置)を使って、左辺(WEST)に「あと」
右辺(EAST)に「日」と表示しています。
日数は中央(CENTER)で背景(Background)を黄色(YELLOW)にしています。
一応これで、1年の残り日数を表示することはできるのですが
・月の残り日数も表示したい
とか
・指定の日にちまでの日数も表示したい
という欲が出てきます。
では、どうやってその指定をするか?
という仕様を決める必要が出ています。
(1)「設定」ボタンを置いて、クリックされたら設定画面(ダイヤログ)を出す
とか
(2)リストから選べるようにする
とか
(3)プログラム起動時に引数(アーギュメント)で指定する
など、色々な方法が考えられます。
作りやすさと使いやすさを考えて(好みもありますが)
(3)の引数で処理することにしましょう。
引数とは、起動の時にプログラム名の後ろにつけるパラメータです。
例えば、このプログラムをjarにして、countdown.jar という名称にした場合
$ java -jar countdown.jar -m
とか
$ java -jar countdown.jar 20120123
などと、”-m” や “20120123” をつけて起動すると
main(String [] args) において
args[0]が”-m” や “20120123” になるのです。
これを処理する例は、また明日。
countdownプログラムを作ってみよう1
countdownプログラムを作ってみよう2
countdownプログラムを作ってみよう3(この記事)
countdownプログラムを作ってみよう4
countdownプログラムを作ってみよう5
countdownプログラムを作ってみよう6
この記事へのコメントはこちら