NetBeansで作ったサンプル時計

なんの飾りもねえ…。

 言い訳はしません。単にswingのタイマーとプログレスバーで遊びたかっただけです XD

時計ダウンロード

ダウンロードはこちら』 なんの飾りもねえですが一応。NetBeansのプロジェクトディレクトリに展開すれば使えます。

キモ

 Javaのタイマーってめんどくさいイメージがあるんですが、swingなら簡単だよって話です。

コードサンプル

 まず、処理本体です。複数のよそのサイトを参考にしました。プログレスバーはNetBeansのデフォルトウインドウについてる奴ですが、ついてるなら使ってやれと XD

 内容は「カレンダーを取得、前回保存分と違っていたらプログレスバーとテキストを更新する」です。初回は何も保存されていないので、デフォで働くでしょう。

    private Calendar cal2;

    class MyAction implements ActionListener {
        public void actionPerformed(ActionEvent ev){
            Calendar cal1 = getCalendar();
            if(!cal1.equals(cal2)){
                progressBar.setValue((cal1.get(Calendar.SECOND)*100)/60);
                textfield1.setText(timeNow(cal1));
                cal2 = cal1;
            }
        }
    }

 カレンダー処理はこちら。まずカレンダーオブジェクトを引きだす。

 ちなみに、たったこれだけを独立させているのは私の趣味です。割り込みごとのカレンダー作成を一回きりにしたかっただけ。(何も考えず作ると、プログレスバー用にもう一回作る事になるので。でも秒データだけ取り出すとかも趣味的に美しくないし…)

    private Calendar getCalendar(){
        Calendar cal1 = Calendar.getInstance();  // カレンダーオブジェクト生成
        return(cal1);
    }

 受け取ったカレンダーから時刻情報をテキストで返す。よそのサイトからもらったサンプルコピーに、ヒトケタ時のゼロ処理を追加したものです。

    private String timeNow(Calendar cal1){
        DecimalFormat nf = new DecimalFormat("00");
        String r = "";
        int year = cal1.get(Calendar.YEAR);        //(2)現在の年を取得
        int month = cal1.get(Calendar.MONTH) + 1;  //(3)現在の月を取得
        int day = cal1.get(Calendar.DATE);         //(4)現在の日を取得
        int hour = cal1.get(Calendar.HOUR_OF_DAY); //(5)現在の時を取得
        int minute = cal1.get(Calendar.MINUTE);    //(6)現在の分を取得
        int second = cal1.get(Calendar.SECOND);    //(7)現在の秒を取得
        StringBuffer dow = new StringBuffer();
        switch (cal1.get(Calendar.DAY_OF_WEEK)) {  //(8)現在の曜日を取得
            case Calendar.SUNDAY: dow.append("日曜日"); break;
            case Calendar.MONDAY: dow.append("月曜日"); break;
            case Calendar.TUESDAY: dow.append("火曜日"); break;
            case Calendar.WEDNESDAY: dow.append("水曜日"); break;
            case Calendar.THURSDAY: dow.append("木曜日"); break;
            case Calendar.FRIDAY: dow.append("金曜日"); break;
            case Calendar.SATURDAY: dow.append("土曜日"); break;
        }
        //(9)現在の年、月、日、曜日、時、分、秒を表示
        r = year + "/" + nf.format(month) + "/" + nf.format(day) + " " + dow
                       + " " + nf.format(hour) + ":" + nf.format(minute) + ":" + nf.format(second);
        return(r);
    }

 最後に、ウインドウ生成時にタイマー作って動かします。このinit()を初期化の最後に呼び出せばよいのです。とっても単純なので、書いてるコメントだけで動作のキモは一目瞭然だと思います。

    private void init(){
        progressBar.setVisible(true); // プログレスバーを見えるようにする。
        MyAction maa = new MyAction(); // 処理本体(クラス定義)を実体としてnewする。
        new Timer(100,maa).start();   // タイマーを仕掛け100msごとにnewしたやつを呼び出すようにする。
    }