2010-03-21 5 views
0

Ci-dessous le code du compte à rebours GUI le plus simple. Peut-on le faire de manière plus courte et plus élégante avec l'utilisation de la minuterie Swing?Cela peut-il être fait de manière plus élégante avec la minuterie Swing?

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

public class CountdownNew { 

    static JLabel label; 

    // Method which defines the appearance of the window. 
    public static void showGUI() { 
     JFrame frame = new JFrame("Simple Countdown"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     label = new JLabel("Some Text"); 
     frame.add(label); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    // Define a new thread in which the countdown is counting down. 
    public static Thread counter = new Thread() { 

     public void run() { 
      for (int i=10; i>0; i=i-1) { 
       updateGUI(i,label); 
       try {Thread.sleep(1000);} catch(InterruptedException e) {}; 
      } 
     } 
    }; 

    // A method which updates GUI (sets a new value of JLabel). 
    private static void updateGUI(final int i, final JLabel label) { 
     SwingUtilities.invokeLater( 
      new Runnable() { 
       public void run() { 
        label.setText("You have " + i + " seconds."); 
       } 
      } 
     ); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       showGUI(); 
       counter.start(); 
      } 
     }); 
    } 

} 

Répondre

4

Oui, vous devriez utiliser une minuterie d'oscillation. Vous NE DEVRIEZ PAS, utiliser un Timer Timer et TimerTask.

Lorsqu'une temporisation Swing se déclenche, le code est exécuté sur l'EDT, ce qui signifie que vous devez simplement appeler la méthode label.setText(). Lorsque vous utilisez le Timer et TimerTask de uitl, le code ne s'exécute pas sur l'EDT, ce qui signifie que vous devez envelopper votre code dans un SwingUtilities.invokeLater pour vous assurer que le code s'exécute sur l'EDT.

Et de cette façon l'utilisation d'une minuterie d'oscillation est plus courte et plus élégante que votre approche actuelle, cela simplifie le codage car le code est exécuté sur l'EDT.

0

Vous pourriez faire un peu plus élégant en utilisant Timer avec un TimerTask approprié.

0

Oui, utilisez une minuterie. updateGUI serait le code pour la tâche de minuteur, mais cela nécessitera quelques changements car vous ne pourrez pas passer dans i pour chaque appel puisque vous venez d'obtenir une méthode run().

Questions connexes