9
votes

Horloge dynamique en Java

Je souhaite mettre en œuvre une horloge au sein de mon programme à Diusplay de la date et de l'heure pendant l'exécution du programme. J'ai examiné le getcurrenttime () méthode et minuterie s mais aucun d'entre eux ne semble faire ce que je voudrais.

Le problème est que je peux obtenir l'heure actuelle lorsque le programme se charge, mais il n'est jamais mis à jour. Toute suggestion sur quelque chose à regarder serait grandement appréciée!


2 commentaires

Je ne balance pas beaucoup, alors aucune réponse détaillée du mien, mais Google semble donner suffisamment d'astuces: Google.com/search?q=java+Swing+Clock au point: vous devez mettre à jour l'horloge vous-même chaque fois dans un fil d'arrière-plan.


@Ballusc mais vous faites de manière approfondie Google;)


7 Réponses :


15
votes

Ce que vous devez faire est d'utiliser La minuterie code> classe.

Il suffit de faire courir chaque seconde et de mettre à jour l'horloge avec l'heure actuelle. P>

Timer t = new Timer(100, updateClockAction);


1 commentaires

J'ai fait un test et la mise à jour a toujours été environ une demi-seconde derrière à l'aide de Javax.swing.Timer, mais je ne sais pas pourquoi



2
votes

Cela ressemble à ce que vous pourriez avoir un problème conceptuel. Lorsque vous créez un nouvel objet Java.Util.Date, il sera initialisé à l'heure actuelle. Si vous souhaitez implémenter une horloge, vous pouvez créer un composant d'interface graphique qui crée constamment un nouvel objet de date et met à jour l'affichage avec la dernière valeur.

Une question que vous pourriez avoir est de savoir comment faire quelque chose à plusieurs reprises sur un calendrier? Vous pouvez avoir une boucle infinie qui crée un nouvel objet de date puis appelle Thread.sleep (1000) afin qu'il obtient la dernière fois chaque seconde. Un moyen plus élégant de le faire est d'utiliser un TimerSk. En règle générale, vous faites quelque chose comme: xxx

puis, pour l'appeler, vous feriez quelque chose comme: xxx


2 commentaires

Ce code fonctionne probablement bien, mais puisque vous utilisez Java.Util.Timer, vous devez vous assurer d'utiliser oscillabilité.invokelater () pour mettre à jour l'interface graphique.


Absolument. J'étais délibérément vague à propos de la "faire quelque chose", je ne voulais pas introduire trop de choses simultanément.



5
votes

Vous devez mettre à jour le texte dans un fil séparé chaque seconde.

Idéalement, vous devez mettre à jour le composant Swing uniquement dans l'EDT (filetage du répartiteur de l'événement) mais, après l'avoir essayé sur ma machine, en utilisant Timer.ScheduleatFixRate m'a donné de meilleurs résultats:

java.util.timer http://img175.imageshack.us/img175/8876/capturadepantalla201006O .png

La version Javax.swing.Timer était toujours environ une demi-seconde derrière:

Javax.swing.Timer http://img241.imagesShack.us/img241/2599/capturadepantalalA201006.png

Je n'ai vraiment pas t sais pourquoi.

voici la source complète: xxx

voici la source modifiée à l'aide de javax.swing.Timer xxx < / pré>

je devrais probablement changer la chaîne avec le La date est calculée, mais je ne pense pas que ce soit le problème ici

J'ai lu, que, depuis Java 5, le recommandé est: ScheduleedExecutetorservice Je vous laisse la tâche de la mettre en œuvre. < / p>


1 commentaires

Je ne sais pas, c'est probablement le temps de démarrage (d'entrer dans l'EDT ou quelque chose) mais je ne pouvais pas les récupérer.



2
votes

Pour ceux qui préférent un affichage analogique: .


0 commentaires

3
votes
   public void start(){
        reset();
        ScheduledExecutorService worker = Executors.newScheduledThreadPool(3);
         worker.scheduleAtFixedRate( new Runnable(){
            public void run(){
                if( currentSecond == 60 ) {
                    reset();
                }
                time.setText( String.format("%s:%02d", sdf.format(calendar.getTime()), currentSecond));
                currentSecond++;
            }
        }, 0, 1000 ,TimeUnit.MILLISECONDS );
    } 

0 commentaires

0
votes

Remarque La méthode planifiezeatfixeDrate est utilisée ici xxx


0 commentaires

0
votes
    Timer timer = new Timer(1000, (ActionEvent e) -> {
        DateTimeFormatter myTime = DateTimeFormatter.ofPattern("HH:mm:ss");
        LocalDateTime now = LocalDateTime.now(); 
        jLabel1.setText(String.valueOf(myTime.format(now)));
    });
    timer.setRepeats(true);
    timer.start();

1 commentaires

Bonjour, bienvenue dans le débordement de la pile. Lorsque vous répondez à une question qui a déjà de nombreuses réponses, assurez-vous d'ajouter des informations supplémentaires sur la raison pour laquelle la réponse que vous fournissez est de fond et ne faisait pas simplement écho à ce qui a déjà été vérifié par l'affiche originale. Ceci est particulièrement important dans les réponses «Code-uniquement» telles que celle que vous avez fournie.