この記事で説明する例では、インターフェース上で Java の動的時刻表示を実現できます。具体的な実装方法をまとめると以下のようになります。
1. 方法 1 では、TimerTask を使用します。
動的更新には java.util.Timer と java.util.TimerTask を使用します。結局のところ、各更新は 1 秒に 1 回発生すると見なすことができます。
コードは次のとおりです。
import java.awt.Dimension;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.Timer;import java.util.TimerTask;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;/** * このクラスは、その方法を説明するための単純な JFrame 実装です。 * JSwing ベースのインターフェイスで時間を動的に表示します。 * @author Edison * */public class TimeFrame extends JFrame{ /* * 変数 */ private JLabel timeLabel; private String DEFAULT_TIME_FORMAT; mm:ss"; private String time; private int ONE_SECOND = 1000; public TimeFrame() { timePanel = new JPanel(); timeLabel = new JLabel("CurrentTime: "); timePanel.add(timeLabel); this.setDefaultCloseOperation (EXIT_ON_CLOSE); this.setSize(新しいディメンション(200,70)); this.setLocationRelativeTo(null); } /** * このメソッドは、1 秒あたりの時間を更新するタイマー タスクを作成します */ private void configTimeArea() { Timer tmr = new Timer(),new JLabelTimerTask(); Date(), ONE_SECOND); } /** * 時刻表示領域を更新するタイマータスク * */ protected クラスJLabelTimerTask は TimerTask を拡張します{ SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_TIME_FORMAT); @Override public void run() { time = dateFormatter.format(Calendar.getInstance().getTime()) } } public static void main(String arg[]) { TimeFrame timeFrame=new TimeFrame(); timeFrame.setVisible(true);
TimerTask を継承してカスタム タスクを作成し、現在時刻を取得し、displayArea を更新します。
次に、タイマーのインスタンスを作成し、1 秒ごとに timertask を実行します。スケジュールを使用すると時刻誤差が生じる可能性があるため、より精度の高いscheduleAtFixedRateを直接呼び出します。
2. 方法 2: スレッドを使用する:
これは比較的単純です。具体的なコードは次のとおりです。
import java.awt.Dimension;import java.text.SimpleDateFormat;import java.util.Calendar;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;/** * このクラスは* JSwing ベースのインターフェイスで時間を動的に表示する方法を説明する簡単な JFrame 実装 * @author Edison * */public class DTimeFrame2 は JFrame を拡張します。 Runnable{ プライベート JPanel タイムパネル; プライベート JLabel 表示エリア; プライベート String ONE_SECOND = 1000; = new JLabel("CurrentTime: "); JLabel(); timePanel.add(timePanel); this.setDefaultCloseOperation(new Dimension(200,70)); ); } public void run() { while(true) { SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_TIME_FORMAT); displayArea.setText(dateFormatter.format(Calendar.getInstance().getTime())); try { Thread.sleep(ONE_SECOND) } {displayArea.setText("エラー!!! "); } } } public static void main(String arg[]) { DTimeFrame2 df2=新しい DTimeFrame2(); df2.setVisible(true);
比較する:
個人的には、方法 1 を好みます。Timer は複数の TimerTask で共有でき、スレッドを生成するとマルチスレッドのメンテナンスの複雑さが増すからです。
次のコードに注目してください。
jFrame.setDefaultCloseOperation(); // 閉じるボタンに特定の動作を追加します。 jFrame.setLocationRelativeTo(null); // フレームを左上ではなく画面の中央に表示します。
上記の方法を少し変更することで、複数の国の時刻を表示することができます。コードは次のとおりです。
import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util .Locale;import java.util.TimeZone;import java.util.Timer;import java.util.TimerTask;import javax.swing.DefaultComboBoxModel;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;/** * 単純な世界時計 * @author Edison * */public class WorldTimeFrame extends JFrame{ /** * */ private staticfinallongserialVersionUID =プライベート文字列時間; プライベート JPanel タイムゾーン; プライベート JComboBox ゾーンボックス; プライベート int ONE_SECOND = 1000; パブリック WorldTimeFrame() JComboBox(); timePanel = new JPanel(); timeZone = TimeZone.getDefault();zoneBox.addActionListener(new ActionListener()) @Override public void actionPerformed(ActionEvent e) { updateTimeZone(TimeZone.getTimeZone((String)zoneBox.getSelectedItem())); } }); timePanel.add(displayArea); this.add(zoneBox, BorderLayout. NORTH); this.add(timePanel, BorderLayout.CENTER); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setVisible(true); } /** * このメソッドは 1 秒あたりの時間を更新するタイマー タスクを作成します */ private void configTimeArea();タイマー tmr = 新しいタイマー () tmr.scheduleAtFixedRate(new) JLabelTimerTask(),new Date(), ONE_SECOND); } /** * 時刻表示領域を更新するタイマータスク * */ public class JLabelTimerTask extends TimerTask{ SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_FORMAT, Locale.ENGLISH); void run() { dateFormatter.setTimeZone(timeZone) ; dateFormatter.format(Calendar.getInstance().getTime()); displayArea.setText(time); } } /** * timeZone を更新します * @param newZone */ public void updateTimeZone(TimeZone newZone) { this.timeZone = newZone ; } public static void main(String arg[]) { new WorldTimeFrame() } }
本来はupdateTimeZone(TimeZone newZone)でdisplayAreaを更新する必要があります。ただし、TimerTask の実行時間が肉眼でわずか 1 秒と短すぎることを考慮すると、基本的にはすぐに更新するのと同じです。 TimerTask の実行時間が長い場合は、displayArea を即座に慎重に更新する必要があります。
補充:
①.pack() は画面サイズを自動的に計算するために使用されます。
②. TimeZone.getAvailableIDs() を使用してすべての TimeZone を取得します。