Les exemples décrits dans cet article peuvent réaliser l'affichage dynamique de l'heure par Java sur l'interface. Les méthodes spécifiques de mise en œuvre sont résumées comme suit :
1. La méthode 1 utilise TimerTask :
Utilisez java.util.Timer et java.util.TimerTask pour les mises à jour dynamiques. Après tout, chaque mise à jour peut être considérée comme se produisant une fois toutes les secondes.
Le code est le suivant :
importer java.awt.Dimension; importer java.text.SimpleDateFormat; importer java.util.Calendar; importer java.util.Date; importer java.util.Timer; importer java.util.TimerTask; importer javax.swing.JFrame; importer javax.swing.JLabel;import javax.swing.JPanel;/** * Cette classe est une implémentation simple de JFrame pour expliquer comment pour * afficher l'heure de manière dynamique sur l'interface basée sur JSwing. * @author Edison * */public class TimeFrame extends JFrame{ /* * Variables */ private JPanel timePanel; private JLabel displayArea; private String DEFAULT_TIME_FORMAT = "HH : mm:ss" ; heure de chaîne privée ; privé int ONE_SECOND = 1000 ; public TimeFrame() { timePanel = new JPanel(); timeLabel = new JLabel("CurrentTime: "); displayArea = new JLabel(); timePanel.add(timeLabel); (EXIT_ON_CLOSE); this.setSize(nouvelle Dimension(200,70)); this.setLocationRelativeTo(null); } /** * Cette méthode crée une tâche de minuterie pour mettre à jour la durée par seconde */ private void configTimeArea() { Timer tmr = new Timer(); Date(), ONE_SECOND); } /** * Tâche de minuterie pour mettre à jour la zone d'affichage de l'heure * */ classe protégée JLabelTimerTask extends 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(true);
Héritez de TimerTask pour créer une tâche personnalisée, obtenir l'heure actuelle et mettre à jour displayArea.
Créez ensuite une instance de timer et exécutez timertask toutes les 1 seconde. Puisqu'il peut y avoir des erreurs de temps lors de l'utilisation de planning, le planningAtFixedRate de plus haute précision est appelé directement.
2. Méthode 2 : Utilisation de threads :
Celui-ci est relativement simple. Le code spécifique est le suivant :
importer java.awt.Dimension; importer java.text.SimpleDateFormat; importer java.util.Calendar; importer javax.swing.JFrame; importer javax.swing.JLabel; importer javax.swing.JPanel;/** * Cette classe est un Implémentation simple de JFrame pour expliquer comment * afficher l'heure de manière dynamique sur l'interface basée sur JSwing * * @author Edison * */public class DTimeFrame2 étend JFrame. implémente Runnable{ cadre JFrame privé ; privé JPanel timeLabel ; privé JLabel displayArea ; privé String DEFAULT_TIME_FORMAT = "HH:mm:ss" ; = nouveau JLabel("HeureActuelle : "); displayArea = nouveau JLabel(); timePanel.add(timeLabel); timePanel.add(displayArea); this.setDefaultCloseOperation(EXIT_ON_CLOSE); ); } public void run() { while(true) { SimpleDateFormat dateFormatter = nouveau SimpleDateFormat(DEFAULT_TIME_FORMAT); displayArea.setText(dateFormatter.format( Calendar.getInstance().getTime())); try { Thread.sleep(ONE_SECOND); } catch(Exception e) { displayArea.setText("Erreur !!! "); } } } public static void main(String arg[]) { DTimeFrame2 df2=new DTimeFrame2(); df2.setVisible(true); Thread thread1=new Thread(df2);
Comparer:
Personnellement, je préfère la première méthode, car Timer peut être partagé par plusieurs TimerTasks, et la génération d'un thread augmentera la complexité de maintenance des multi-threads.
Faites attention au code suivant :
jFrame.setDefaultCloseOperation(); // Ajoute un comportement spécifique au bouton de fermeture jFrame.setLocationRelativeTo(null); // Fait apparaître le cadre au milieu de l'écran au lieu du coin supérieur gauche.
En modifiant légèrement la méthode ci-dessus, vous pouvez afficher l'heure dans plusieurs pays. Le code est le suivant :
importer java.awt.BorderLayout; importer java.awt.event.ActionEvent; importer java.awt.event.ActionListener; importer java.text.SimpleDateFormat; importer java.util.Calendar; importer java.util.Date; importer java.util .Locale ; importer java.util.TimeZone ; importer java.util.Timer ; importer java.util.TimerTask;importer javax.swing.DefaultComboBoxModel;importer javax.swing.JComboBox;importer javax.swing.JFrame;importer javax.swing.JLabel;importer javax.swing.JPanel;/** * Une horloge mondiale simple * @author Edison * */public class WorldTimeFrame extends JFrame{ /** * */ private static final long serialVersionUID = private String time; private JPanel timePanel; private TimeZone timeZone; private JComboBox zoneBox; private int ONE_SECOND = 1000; private String 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 public void actionPerformed(ActionEvent e) { updateTimeZone(TimeZone.getTimeZone((String) zoneBox.getSelectedItem())); } }); configTimeArea(); timePanel.add(displayArea); this.setLayout(new BorderLayout()); NORD); this.add(timePanel, BorderLayout.CENTER); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setVisible(true); pack(); /** * Cette méthode crée une tâche de minuterie pour mettre à jour la durée par seconde */ private void configTimeArea() { Minuterie tmr = new Timer(); tmr.scheduleAtFixedRate(new JLabelTimerTask(),new Date(), ONE_SECOND); } /** * Tâche de minuterie pour mettre à jour la zone d'affichage de l'heure * */ public class JLabelTimerTask extends TimerTask{ SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_FORMAT, Locale.ENGLISH); void run() { dateFormatter.setTimeZone(timeZone time =); dateFormatter.format(Calendar.getInstance().getTime()); displayArea.setText(time); } } /** * Mettre à jour le timeZone * @param newZone */ public void updateTimeZone(TimeZone newZone) { this.timeZone = newZone ; } public static void main(String arg[]) { new WorldTimeFrame( } }
À l’origine, displayArea doit être mis à jour dans updateTimeZone (TimeZone newZone). Cependant, étant donné que le temps d'exécution de TimerTask est trop court, seulement 1 seconde, à l'œil nu, cela revient fondamentalement à une mise à jour immédiate. Si le temps d'exécution de TimerTask est long, la displayArea doit être mise à jour immédiatement et soigneusement.
Remplir:
①. pack() est utilisé pour calculer automatiquement la taille de l'écran ;
②. TimeZone.getAvailableIDs() est utilisé pour obtenir tous les TimeZone.