essayer de faire une partie de l'application Java Swing, qui devrait faire:application minuterie à l'intérieur SwingWorker Java Swing ne fonctionne pas
- quand un bouton est cliqué, prend valeur de l'utilisateur (entier) de « minutes » de un champ de texte;
- instancie et objet qui est en fait un thread SwingWorker, qui va démarrer un compte à rebours à zéro utilisateur "minutes" puis effectuer une action (lancer un autre JFrame) dans done(), après que doInBackground() se termine;
Je mis des impressions sur certains points dans le code et il semble que le code prend minutes d'entrée de textField, passe au constructeur en classe de compte à rebours, mais exécute simplement fait(), sans courir doInBackground() premier .
Si quelqu'un a un indice pourquoi est-ce que cela se produit, je serais reconnaissant, j'ai essayé toutes mes idées et rien ne fonctionne.
Voici la première partie, le code du bouton:
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
userCountTime = Integer.parseInt(jTextField2.getText());
userCountTime = userCountTime * 60;
System.out.println("Preuzeto iz dugmeta " + userCountTime);
if (jRadioButton2.isSelected()){
Countdown countDown= new Countdown (userCountTime);
}
Voici le compte à rebours de la classe:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.SwingWorker;
import javax.swing.Timer;
/**
*
* @author Glupko
*/
public class Countdown extends SwingWorker{
public Timer timer;
static int userCountTime;
static ActionListener timerListener;
//Constructor
public Countdown (int userCountTime){
Countdown.userCountTime = userCountTime;
System.out.println("In constructor: " + Countdown.userCountTime);
this.execute();
}
@Override
protected Object doInBackground() throws Exception {
//defining listener
timerListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
System.out.println("In action performed value is: " + userCountTime);
//for each tick we subtract 1, every second
while (userCountTime >= 0){
userCountTime--;
System.out.println("In actionPerformed there is number of seconds: " + userCountTime);}
timer = new Timer(1000, timerListener);
//start timer
timer.start();
}};}
@Override
protected void done(){
System.out.println("From done: timer elapsed");
ChangingWindow window = new ChangingWindow();
}
}
Un grand merci à l'avance!
1) Vous ne devriez pas démarrer un minuteur Swing à partir de la méthode 'doInBackground' de SwingWorker. Cela va à l'encontre de tous les objectifs, car une minuterie d'oscillation doit être exécutée sur le thread d'événement Swing ou EDT. 2) La méthode done de votre SwingWorker sera appelée immédiatement puisque le 'timer.start()' est non-bloquant –
Merci Hovercraft Full Of Eels, je l'ai fonctionné :) Juste pour la curiosité - dans mon cas quand la minuterie fonctionne tout les boutons sont bloqués et l'application attend juste la fin de la minuterie et c'est bien. Dans le cas d'une application plus importante, cela bloquerait l'EDT entière, n'est-ce pas? Comment pourrais-je mettre en œuvre le minuteur pour une tâche très spécifique dans ce cas? Encore une fois, merci beaucoup pour votre aide! – junior
Si cela est fait correctement, le temporisateur ** ne devrait pas ** bloquer. Avez-vous d'autres codes qui bloquent l'EDT et que nous ne connaissons pas? –