2014-05-20 4 views
0

J'essaie la minuterie start-stop via la même touche J. Laisse-moi partager mon code.Minuterie Start-Stop via le même bouton

Bouton Action;

private void ButtonActionPerformed(java.awt.event.ActionEvent evt) {          

     if(Button.getText().equals("START")){ 
     Button.setText("STOP"); 
     Spinner.setEnabled(false); 
     Informer.setBackground(Color.green); 
     Informer.setText("Running"); 
     Timer time = new Timer(); 
     ScheduledTask st = new ScheduledTask(); 
     time.schedule(st, 0, (int) Spinner.getValue()*1000*60); 
     } 
     else{ 
     Button.setText("START"); 
     Spinner.setEnabled(true); 
     Informer.setBackground(Color.red); 
     Informer.setText("Stopped"); 

     } 

    } 

Lorsque l'utilisateur appuie sur le bouton; Nom de la touche a changé ARRÊT de START nommé informateur peinture textfield au vert et à écrire dans la course, et ci-dessous minuterie a commencé,

public class ScheduledTask extends TimerTask { 

    public void run() { 
     if (Button.getText().equals("STOP")){ 
        Worker1 worker1 = new Worker1(); 
        worker1.execute(); 
       } 
       else{ 
       ScheduledTask.this.cancel(); 
       } 
    } 
} 

Comme vous pouvez le voir exécuter une minuterie SwingWorker worker1 nommé. Si j'appuie à nouveau sur le bouton (appelé STOP), le bouton j est renommé sur START et la minuterie ne voit pas STOP dans le texte du bouton. Imaginez la configuration de la minuterie 1 min et appuyez sur le bouton START. Lorsque le bouton START est pressé, le worker1 est exécuté immédiatement et le compte à rebours commence, vous savez. En 20-30 secondes, appuyez sur le bouton STOP et attendez 5-10 secondes. Appuyez à nouveau sur le bouton START. Le problème est ici 2 minuterie déjà en cours maintenant. Lorsque le compte à rebours de la première minuterie est terminé, worker1 est exécuté. 5-10 secondes plus tard, la minuterie finit le compte à rebours et recommence le travail1. Comment puis-je arrêter le compte à rebours de la minuterie en cours lorsque le même bouton est enfoncé si un compte à rebours est déjà actif?

+0

N'utilisez pas de 'TimerTask' ici. Au lieu de cela, implémentez un «temporisateur» Swing pour les tâches répétitives ou un «SwingWorker» pour les tâches longues. Voir [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) pour plus de détails. –

+0

Pour une meilleure aide plus tôt, postez un [MCVE] (http://stackoverflow.com/help/mcve) (Exemple minimal et vérifiable minimal). –

Répondre

0

Vous pouvez utiliser deux boutons différents au même endroit. Au début, lorsque le bouton de démarrage est enfoncé, la minuterie démarre et le bouton disparaît et le bouton d'arrêt monte et vice versa.

+0

Je peux utiliser cette méthode à la place d'un bouton merci pour suggestion. –

0

Le probmen n'est pas du tout dans les JButtons swing.

Le problème est que vous n'annulez pas les tâches de travail correctement. Ici:

if (Button.getText().equals("STOP")){ 
       Worker1 worker1 = new Worker1(); 
       worker1.execute(); 
    } 
    else{ 
      ScheduledTask.this.cancel(); 
    } 

Vous n'avez aucune garantie que le bouton aura le texte "STOP" lorsque la minuterie est terminée.

Vous devez arrêter le temporisateur lui-même lorsque vous appuyez sur le bouton d'arrêt, pour éviter de commencer votre tâche planifiée en premier lieu.

+0

Exactement vous avez raison. Mais si j'utilise le même bouton pour l'action start-stop, je dois utiliser if condition dans ButtonAction que vous connaissez. Comment puis-je arrêter le minuteur actuel en dehors de la clause? –

+0

Oui, vous ne pourrez pas utiliser si condition. Arrêt de la minuterie à l'intérieur si la condition est parfaite, si vous demandez comment arrêter la minuterie, vérifiez les trois premiers résultats sur googling "java cancel timer" – kajacx

+0

Mais la variable de temps n'est pas reconnue sous else condition dans mon code d'action. Alors, comment puis-je arrêter TimerTask actuellement activé lorsque vous appuyez sur le même bouton? –

Questions connexes