Question

est-ce mieux d'utiliser javax.swing.Timer à l'intérieur d'une application swing au lieu d'utiliser java.util.Timer?

Par exemple:

Timer timer = new Timer(1000, e -> label.setText(new Date().toString()));
    timer.setCoalesce(true);
    timer.setRepeats(true);
    timer.setInitialDelay(0);
    timer.start();

ou

new java.util.Timer().scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            label.setText(new Date().toString());
        }
    }, 0, 1000);

y a-t-il une différence entre ces deux ?

Était-ce utile?

La solution

La différence:

UN java.util.Timer démarre le sien Thread pour exécuter la tâche.

UN javax.swing.Timer planifie les tâches à exécuter sur le EDT.

Maintenant. Swing est à thread unique.

Vous devez accéder et muter les composants Swing à partir de l'EDT uniquement.

Par conséquent, pour apporter des modifications à l'interface graphique toutes les X secondes, utilisez la minuterie Swing.Pour effectuer une logique métier en arrière-plan, utilisez l'autre minuteur.Ou mieux un ScheduledExecutorService.

Gardez une chose très importante à l’esprit :si vous passez du temps sur l'EDT, il ne peut pas passer de temps à mettre à jour l'interface graphique.

Autres conseils

La principale différence est que le javax.swing.Timer exécute son code sur l'EDT pendant que le java.util.timer s'exécute sur un thread séparé.Pour cette raison, les minuteries swing sont mieux utilisées si vous manipulez l'interface graphique de quelque manière que ce soit.Cependant, si vous préférez utiliser un autre type de minuterie, vous pouvez toujours appeler votre code sur l'EDT.

new java.util.Timer().scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
            label.setText(new Date().toString());
        }
    });
}, 0, 1000);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top