Contoh yang dijelaskan dalam artikel ini dapat mewujudkan tampilan waktu dinamis Java pada antarmuka. Metode implementasi spesifik dirangkum sebagai berikut:
1. Metode 1 menggunakan TimerTask:
Gunakan java.util.Timer dan java.util.TimerTask untuk pembaruan dinamis. Bagaimanapun, setiap pembaruan dapat dianggap terjadi setiap 1 detik sekali.
Kodenya adalah sebagai berikut:
impor java.awt.Dimension;impor java.text.SimpleDateFormat;impor java.util.Calendar;impor java.util.Date;impor java.util.Timer;impor java.util.TimerTask;impor javax.swing.JFrame;impor javax.swing.JLabel;import javax.swing.JPanel;/** * Kelas ini adalah implementasi JFrame sederhana untuk menjelaskan caranya untuk * menampilkan waktu secara dinamis pada antarmuka berbasis JSwing. * @author Edison * */public class TimeFrame extends JFrame{ /* * Variables */ private JPanel timePanel private JLabel timeLabel; mm:ss"; waktu String pribadi; int pribadi ONE_SECOND = 1000; TimeFrame publik() { timePanel = baru JPanel(); timeLabel = new JLabel("Waktu Saat Ini: "); displayArea = new JLabel(); configTimeArea(); timePanel.add(timeLabel.add(displayArea); (EXIT_ON_CLOSE); this.setSize(Dimensi baru(200,70)); this.setLocationRelativeTo(null); } /** * Metode ini membuat tugas pengatur waktu untuk memperbarui waktu per detik */ private void configTimeArea() { Timer tmr = new Timer(); Date(), ONE_SECOND); } /** * Tugas pengatur waktu untuk memperbarui area tampilan waktu * */ kelas yang dilindungi JLabelTimerTask memperluas TimerTask{ SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_TIME_FORMAT); @Override public void run() { time = dateFormatter.format(Calendar.getInstance().getTime()); displayArea.setText(time); main(String arg[]) { TimeFrame timeFrame=New TimeFrame(); timeFrame.setVisible(benar);
Mewarisi TimerTask untuk membuat tugas khusus, mendapatkan waktu saat ini, dan memperbarui displayArea.
Kemudian buat instance pengatur waktu dan jalankan tugas waktu setiap 1 detik. Karena mungkin ada kesalahan waktu saat menggunakan jadwal, scheduleAtFixedRate dengan presisi lebih tinggi dipanggil secara langsung.
2. Metode 2: Menggunakan utas:
Yang ini relatif sederhana. Kode spesifiknya adalah sebagai berikut:
import java.awt.Dimension;import java.text.SimpleDateFormat;import java.util.Calendar;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;/** * Kelas ini adalah implementasi JFrame sederhana untuk menjelaskan cara * menampilkan waktu secara dinamis pada antarmuka berbasis JSwing mengimplementasikan Runnable{ bingkai JFrame pribadi; timePanel JPanel pribadi; label waktu JLabel pribadi; Area tampilan JLabel pribadi; String pribadi DEFAULT_TIME_FORMAT = "HH:mm:ss"; = new JLabel("Waktu Saat Ini: ");Area tampilan = baru JLabel(); timePanel.add(timeLabel); timePanel.add(displayArea); this.add(timePanel); this.setDefaultCloseOperation(EXIT_ON_CLOSE); ); } public void run() { while(true) { SimpleDateFormat dateFormatter = baru SimpleDateFormat(DEFAULT_TIME_FORMAT); displayArea.setText(dateFormatter.format( Kalender.getInstance().getTime())); coba { Thread.sleep(ONE_SECOND); "); } } } public static void main(String arg[]) { DTimeFrame2 df2=baru DTimeFrame2(); df2.setVisible(benar); Utas thread1=Utas baru(df2);
Membandingkan:
Secara pribadi, saya lebih suka metode satu, karena Timer dapat dibagikan oleh beberapa TimerTasks, dan menghasilkan thread akan meningkatkan kompleksitas pemeliharaan multi-thread.
Perhatikan kode berikut:
jFrame.setDefaultCloseOperation(); // Tambahkan perilaku spesifik ke tombol tutup jFrame.setLocationRelativeTo(null);
Dengan sedikit memodifikasi metode di atas, Anda dapat menampilkan waktu di banyak negara. Kodenya adalah sebagai berikut:
impor java.awt.BorderLayout;impor java.awt.event.ActionEvent;impor java.awt.event.ActionListener;impor java.text.SimpleDateFormat;impor java.util.Calendar;impor java.util.Date;impor java.util .Lokal;impor java.util.TimeZone;impor java.util.Timer;impor java.util.TimerTask;import javax.swing.DefaultComboBoxModel;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;/** * Jam dunia sederhana * @penulis Edison * */kelas publik WorldTimeFrame memperluas JFrame{ /** * */ private static final long serialVersionUID = waktu String pribadi; timePanel JPanel pribadi; TimeZone timeZone pribadi; JComboBox zoneBox pribadi; private JLabel displayArea; private int ONE_SECOND = 1000; JComboBox(); timePanel = JPanel baru(); displayArea = JLabel baru(); timeZone = TimeZone.getDefault(); @Override public void actionPerformed(ActionEvent e) { updateTimeZone(TimeZone.getTimeZone((String) zoneBox.getSelectedItem())); } }); configTimeArea(); timePanel.add(displayArea); UTARA); this.add(timePanel, BorderLayout.CENTER); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setVisible(true); Timer tmr = Timer baru(); tmr.scheduleAtFixedRate(baru JLabelTimerTask(),new Date(), ONE_SECOND); /** * Tugas pengatur waktu untuk memperbarui area tampilan waktu * */ 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); ; } public static void main(String arg[]) { new WorldTimeFrame();
Awalnya, displayArea perlu diperbarui di updateTimeZone(TimeZone newZone). Namun mengingat waktu eksekusi TimerTask yang terlalu singkat, hanya 1 detik, secara kasat mata pada dasarnya sama saja dengan melakukan update langsung. Jika waktu eksekusi TimerTask lama, displayArea harus segera diperbarui dan hati-hati.
Mengisi kembali:
①.pack() digunakan untuk menghitung ukuran layar secara otomatis;
②. TimeZone.getAvailableIDs() digunakan untuk mendapatkan semua TimeZone.