![]() | DigitalClock | サンプルソース |
|---|---|---|
現在の時間を表示するシンプルなSwingプログラム。String.formatメソッドで、時間を文字列に整形する方法も紹介してます。 |
DigitalClock.java |
/**
* 愛のJava256本ノック for Java 5.0
* Javaサンプルソース ver0.2C "DigitalClock"
* DigitalClock.java 「時間を文字列に整形してデジタル時計」
*
* 2005/09/23 制作:安永ノリカズ
*
* 【コンパイル&実行方法】
* >javac DigitalClock.java
* >java DigitalClock
* 【キーワード】
* 書式文字列(format string), ベースライン(base line:基準線),
* アセント(ascent:上昇), ディセント(descent:下降),
* 【試してみよう】
* java.text.SimpleDateFormatを使って時刻を整形する
* 年月日も表示する。
* アナログ時計を作る。
*/
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.lang.String;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class DigitalClock extends JFrame {
final static int C00 = 1000;
public DigitalClock() {
DrawPanel L00 = new DrawPanel();
add(L00);
new Timer(C00, L00).start();
}
public static void main(String[] A00) {
Toolkit.getDefaultToolkit().setDynamicLayout(true);
DigitalClock L00 = new DigitalClock();
L00.setTitle("デジタル時計");
L00.setDefaultCloseOperation(EXIT_ON_CLOSE);
L00.setBackground(Color.white);
L00.setSize(200, 100);
L00.setVisible(true);
}
}
class DrawPanel extends JPanel implements ActionListener {
public DrawPanel() {
setBackground(Color.white);
}
public void actionPerformed(ActionEvent A00) {
repaint();
}
public void paintComponent(Graphics A00) {
super.paintComponent(A00);
String L00 = String.format("%1$tp %1$tI:%1$tM:%1$tS", new Date());
FontMetrics L01 = A00.getFontMetrics();
A00.drawString(L00, (getWidth() - L01.stringWidth(L00)) / 2,
(getHeight() + L01.getAscent() - L01.getDescent()) / 2);
}
}
/* ■ クラスの外でちょっと一言 ■
時刻をリアルタイムで表示するには、定期的に画面を更新しないといけません。
そのために利用しているのが、javax.swing.Timerクラス。1秒ごとにイベントを
発生させ、イベント処理メソッドで画面の再描画要求を出しています。
時刻の文字列を取得するには、java.text.SimpleDateFormat、もしくは
String.formatメソッドを使います。今回はJ2SE 5.0で導入された書式文字列を
使って、String.formatメソッドでフォーマットする方法を採用しました。
"%1$tp %1$tI:%1$tM:%1$tS"という書式は一見複雑ですが、その意味を知ってれ
ば恐れるに足らず。まず"%"で始まる文字列が書式の指示を表します。その後に
続く"1$"は、1番目の引数(= new Date())という意味。つまり4箇所の"%"の部分
が、Dateオブジェクトを文字列化したものに置き換えられます。
"t"という指定は、「日付/時刻」に変換するという意味。"p"は午前か午後、"I"
は12時間制の時、"M"は分、"S"は秒を表します。":"のように書式として解釈さ
れなかったものは、そのまま表示されます。これで、"午前か午後 時:分:秒"
という書式の文字列が完成。詳しくはAPIドキュメントのjava.util.Formatterに
ある、書式文字列の解説を参照してください。
時刻を画面の中心に表示するために、フォントの詳細な情報を取得してます。こ
こで重要になるのが、フォントにおける「ベースライン」という概念。学校で初
めてアルファベットを習ったときの英語のノートを思い出してください。4本線
の下から2番目が赤くなってましたよね。あれが「ベースライン」。'A'はその線
から上に、'y'や'g'は下にはみ出すように配置されます。その「ベースライン」
より上の高さを「アセント」、下の高さを「ディセント」と呼ぶので、これも覚
えておいてください。
*/