Los ejemplos descritos en este artículo pueden realizar la visualización dinámica del tiempo en la interfaz de Java. Los métodos de implementación específicos se resumen a continuación:
1. El método 1 usa TimerTask:
Utilice java.util.Timer y java.util.TimerTask para actualizaciones dinámicas. Después de todo, se puede considerar que cada actualización ocurre una vez cada segundo.
El código es el siguiente:
importar java.awt.Dimension;importar java.text.SimpleDateFormat;importar java.util.Calendar;importar java.util.Date;importar java.util.Timer;importar java.util.TimerTask;importar javax.swing.JFrame;importar javax.swing.JLabel;import javax.swing.JPanel;/** * Esta clase es una implementación JFrame simple para explicar cómo para * mostrar la hora dinámicamente en la interfaz basada en JSwing * * @author Edison * */public class TimeFrame extends JFrame{ /* * Variables */ private JPanel timePanel private JLabel displayArea; mm:ss"; tiempo de cadena privada; privado int UN_SECOND = 1000; timeFrame público() { timePanel = nuevo JPanel(); timeLabel = new JLabel("CurrentTime: "); displayArea = new JLabel(); timePanel.add(timePanel.add(displayArea); (EXIT_ON_CLOSE); this.setSize(nueva Dimensión(200,70)); this.setLocationRelativeTo(null); } /** * Este método crea una tarea de temporizador para actualizar el tiempo por segundo */ private void configTimeArea() { Timer tmr = new Timer(); Date(), ONE_SECOND); } /** * Tarea del temporizador para actualizar el área de visualización de la hora * */ clase protegida JLabelTimerTask extiende TimerTask{ SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_TIME_FORMAT); @Override public void run() { time = dateFormatter.format(Calendar.getInstance().getTime()); displayArea.setText(time); main(String arg[]) { Marco de tiempo marco de tiempo=nuevo marco de tiempo(); timeFrame.setVisible(verdadero); } }
Herede TimerTask para crear una tarea personalizada, obtener la hora actual y actualizar displayArea.
Luego cree una instancia de temporizador y ejecute timertask cada 1 segundo. Dado que puede haber errores de tiempo al utilizar la programación, se llama directamente a ScheduleAtFixedRate de mayor precisión.
2. Método 2: Usar hilos:
Este es relativamente simple. El código específico es el siguiente:
import java.awt.Dimension;import java.text.SimpleDateFormat;import java.util.Calendar;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;/** * Esta clase es una Implementación simple de JFrame para explicar cómo * mostrar la hora dinámicamente en la interfaz basada en JSwing * @author Edison * */public class DTimeFrame2 extiende JFrame. implementa Runnable{ marco JFrame privado; JPanel privado timeLabel; privado JLabel displayArea; cadena privada DEFAULT_TIME_FORMAT = "HH:mm:ss"; privado int ONE_SECOND = 1000; = nuevo JLabel("HoraActual: "); área de visualización = nuevo JLabel(); timePanel.add(timeLabel); timePanel.add(displayArea); this.add(timePanel); this.setLocationRelativeTo(null); } public void run() { while(true) { SimpleDateFormat dateFormatter = nuevo); SimpleDateFormat(DEFAULT_TIME_FORMAT); displayArea.setText(dateFormatter.format( Calendar.getInstance().getTime())); intente { Thread.sleep(ONE_SECOND } catch(Exception e) { displayArea.setText("¡¡Error!!! "); } } } principal vacío estático público (String arg[]) { DTimeFrame2 df2=new DTimeFrame2(); df2.setVisible(true); Hilo thread1=new Thread(df2.start());
Comparar:
Personalmente, prefiero el método uno, porque el temporizador puede ser compartido por múltiples TimerTasks y generar un subproceso aumentará la complejidad del mantenimiento de los subprocesos múltiples.
Preste atención al siguiente código:
jFrame.setDefaultCloseOperation(); // Agregar un comportamiento específico al botón de cierre jFrame.setLocationRelativeTo(null); // Hacer que el marco aparezca en el medio de la pantalla en lugar de en la parte superior izquierda.
Modificando ligeramente el método anterior, puede mostrar la hora en varios países. El código es el siguiente:
importar java.awt.BorderLayout;importar java.awt.event.ActionEvent;importar java.awt.event.ActionListener;importar java.text.SimpleDateFormat;importar java.util.Calendar;importar java.util.Date;importar java.util .Locale;importar java.util.TimeZone;importar java.util.Timer;importar java.util.TimerTask;importar javax.swing.DefaultComboBoxModel;importar javax.swing.JComboBox;importar javax.swing.JFrame;importar javax.swing.JLabel;importar javax.swing.JPanel;/** * Un reloj mundial simple * @autor Edison * */public class WorldTimeFrame extiende JFrame{ /** * */ privado estático final largo serialVersionUID = hora de cadena privada; panel de tiempo JPanel privado; zona horaria privada JComboBox zona de visualización; privado int ONE_SECOND = 1000 cadena privada DEFAULT_FORMAT = "EEE d MMM, HH: mm: ss"; JComboBox(); timePanel = new JPanel(); displayArea = new JLabel(); timeZone = TimeZone.getDefault(); zoneBox.setModel(new DefaultComboBoxModel(TimeZone.getAvailableIDs())); @Override acción nula pública realizada (ActionEvent e) { updateTimeZone(TimeZone.getTimeZone((String) ZoneBox.getSelectedItem())); this.add(zoneBox, BorderLayout). NORTE); this.add(timePanel, BorderLayout.CENTER); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setVisible(true pack() } /** * Este método crea una tarea de temporizador para actualizar el tiempo por segundo */ private void configTimeArea(); Temporizador tmr = nuevo Temporizador(); tmr.scheduleAtFixedRate(nuevo JLabelTimerTask(),new Date(), ONE_SECOND); } /** * Tarea de temporizador para actualizar el área de visualización de la hora * */ 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); /** * Actualizar la zona horaria * @param newZone */ public void updateTimeZone(TimeZone newZone) { this.timeZone = newZone ; } public static void main(String arg[]) { nuevo WorldTimeFrame();
Originalmente, displayArea debe actualizarse en updateTimeZone (TimeZone newZone). Sin embargo, considerando que el tiempo de ejecución de TimerTask es demasiado corto, solo 1 segundo, a simple vista es básicamente lo mismo que actualizar inmediatamente. Si el tiempo de ejecución de TimerTask es largo, displayArea debe actualizarse inmediatamente y con cuidado.
Reponer:
①. pack() se utiliza para calcular automáticamente el tamaño de la pantalla;
② TimeZone.getAvailableIDs() se utiliza para obtener todas las zonas horarias.