Problème mise à jour texte Label Chronomètre- Java
Résolu/Fermé
A voir également:
- Problème mise à jour texte Label Chronomètre- Java
- Mise à jour pilote - Guide
- Mise a jour airpods - Guide
- Mise a jour windows 10 - Guide
- Mise a jour xiaomi - Guide
- Mise a jour chrome - Guide
3 réponses
KX
Messages postés
16734
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 avril 2024
3 015
22 mai 2020 à 10:18
22 mai 2020 à 10:18
Bonjour,
Une méthode d'action (handle) doit être très rapide, sinon le bouton va rester coincé et c'est toute la fenêtre qui va freezer.
Il est donc hors de question de mettre des sleep dans ce genre de méthodes.
Ce qu'il faut faire c'est avoir un thread à part, qui va gérer la boucle et les sleep. L'action du bouton doit se contenter de démarrer la tâche de fond et rendre la main immédiatement.
Voir :
https://fabrice-bouye.developpez.com/tutoriels/javafx/gui-service-tache-de-fond-thread-javafx/
Une méthode d'action (handle) doit être très rapide, sinon le bouton va rester coincé et c'est toute la fenêtre qui va freezer.
Il est donc hors de question de mettre des sleep dans ce genre de méthodes.
Ce qu'il faut faire c'est avoir un thread à part, qui va gérer la boucle et les sleep. L'action du bouton doit se contenter de démarrer la tâche de fond et rendre la main immédiatement.
Voir :
https://fabrice-bouye.developpez.com/tutoriels/javafx/gui-service-tache-de-fond-thread-javafx/
Bonjour,
Merci enormément pour cette réponse ultra-complète !
Ca marche, c'est ce qu'il me fallait.
Maintenant, je voudrai passer en mode affichage minute et secondes côte à côte.
C'est à dire obtenir quelque chose du style : Temps 01m 15s.
J'ai bien créé ma variable minutes et fait ma condition dans le Timer Service pour incrémenter les minutes.
Mais du coup, je cherche maintenant à récupérer les minutes, les afficher et récupérer les seconde puis les afficher.
Je pensais pouvoir utiliser les getters de secondes et minutes, mais j'ai une erreur du type " local variable timerService may not have been initialized".
Finalement, comment récupérer les secondes et les minutes indépendamment ?
Merci encore.
Merci enormément pour cette réponse ultra-complète !
Ca marche, c'est ce qu'il me fallait.
Maintenant, je voudrai passer en mode affichage minute et secondes côte à côte.
C'est à dire obtenir quelque chose du style : Temps 01m 15s.
J'ai bien créé ma variable minutes et fait ma condition dans le Timer Service pour incrémenter les minutes.
public class TimerService extends ScheduledService<Void> {
private final AtomicInteger secondes;
private final AtomicInteger minutes;
private final Consumer<Integer> onCall;
public TimerService(Consumer<Integer> onCall) {
secondes = new AtomicInteger(0);
minutes = new AtomicInteger(0);
this.onCall = onCall;
}
@Override
protected Task<Void> createTask() {
return new Task<Void>() {
@Override
protected Void call() {
onCall.accept(secondes.getAndIncrement());
if (secondes.get() > 59) {
secondes.set(0);
onCall.accept(minutes.getAndIncrement());
// Test affichage dans la console
System.out.println(minutes);
}
return null;
}
};
}
public AtomicInteger getSecondes() {
return secondes;
}
public AtomicInteger getMinutes() {
return minutes;
}
}
Mais du coup, je cherche maintenant à récupérer les minutes, les afficher et récupérer les seconde puis les afficher.
Je pensais pouvoir utiliser les getters de secondes et minutes, mais j'ai une erreur du type " local variable timerService may not have been initialized".
Finalement, comment récupérer les secondes et les minutes indépendamment ?
TimerService timerService = new TimerService(timer ->
Platform.runLater(() -> label.setText("Temps : "+timerService.getMinutes()+"min"+timerService.getSecondes()+"sec")));
Merci encore.
KX
Messages postés
16734
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 avril 2024
3 015
23 mai 2020 à 15:57
23 mai 2020 à 15:57
"local variable timerService may not have been initialized"Le problème c'est que tu fais
TimerService timerService = new TimerService(... timerService ...)mais tu ne peux pas utiliser timerService tant que son new n'est pas terminé, il est donc impossible qu'il puisse être utilisé en paramètre de son propre constructeur.
Pour que ça fonctionne avec les minutes, tu n'as pas besoin de modifier TimerService, il faut juste faire la division par 60 du nombre de secondes.
TimerService timerService = new TimerService(time -> { final int minutes = time / 60; final int seconds = time % 60; final String text = "Temps : " + minutes + "min" + secondes + "sec"; Platform.runLater(() -> label.setText(text)); });
Modifié le 23 mai 2020 à 08:54
Merci de votre réponse.
J'ai essayé de le faire avec un thread et une task.
J'ai séparé mon code comme cela :
MainApp.java :
et lancerTimer.java :
J'obtiens cette erreur " Exception in thread "Thread-2" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-2" et rien ne se passe dans ma fenêtre JavaFX.
Je dois mal maîtriser la notion de Task et Thread...
Si vous arrivez à m'indiquer ce qui ne marche pas... Merci encore de votre aide !
Cordialement
23 mai 2020 à 09:49
Le problème c'est que tu essayes de modifier l'affichage directement dans le thread de ta tâche de fond, alors qu'il devrait être modifié par le thread d'affichage JavaFX, il faut que tu invoques la méthode Platform.runLater()
Remarque : plutôt que d'utiliser une boucle et un sleep, tu peux utiliser un ScheduledService, par exemple :