2016-04-04 10 views
0

Hallo allerseits ich möchte fragen, ob es möglich ist, nicht Timer in Java netbeans zu verwenden, um auf meinem JLabel den ganzen Wert meiner Variablen "counter" mit while-Schleife anzuzeigen. Hier ist mein Beispielcode.Möglich, Timer nicht zu verwenden

int counter = 0; 

while (counter < 10) { 
    lblDisplay.setText("Completed " + Integer.toString(counter)); 
    try { 
     Thread.sleep(1000); 
     lblDisplay.setText("Completed " + Integer.toString(counter)); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(Increment.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    counter++; 
} 

in der Verwendung von system.out.println wurde es angezeigt, aber in meinem Label war nicht.

+2

Die eigentliche Frage ist warum? Was macht Ihr Ansatz besser als Swing 'Timer'? – MadProgrammer

+0

Bitte lesen Sie die zu beantwortenden Änderungen. Bitte fragen Sie nach eventuellen Fragen. –

Antwort

3

Ja, es ist möglich, einen Swing-Timer zu vermeiden, mit, dies zu erreichen, aber wenn Sie tut dies dann:

  • Sie haben würden sicherstellen, dass die Schleife und die Thread.sleep(...) in einem Hintergrund laufen gelassen wurden Faden des Swing-Ereignisthreads. Wenn Sie dies nicht tun, frieren Sie den Event-Thread ein und frieren Ihre GUI ein und machen sie unbrauchbar.
  • Und dann müssen Sie sicherstellen, dass wenn Sie Swing-Aufrufe nur aus dem Hintergrundthread machen, Sie sich bemühen, diese Aufrufe in den Swing-Ereignisversand Thread einzufügen. Wenn Sie dies nicht tun, besteht die Gefahr, dass Threading-Fehler gelegentlich sehr schwer zu beheben sind.

Wegen der zusätzlichen Arbeitsaufwand und das Risiko der es falsch bekommen, werden Sie feststellen, dass es viel einfacher und sicherer nur eine Swing-Timer zu verwenden. Zum Beispiel sieht Ihr geposteter Code so aus, als wäre es ein großes Risiko, die gesamte GUI/Anwendung in den Ruhezustand zu versetzen, da er sowohl eine while-Schleife als auch eine Thread.sleep(...) aufgerufen hat, ohne dass Threading betroffen ist.

Zum Beispiel, ohne Timer, könnten Sie den Code in etwa so aussehen (Einschränkung: Code nicht kompiliert noch getestet):

new Thread(new Runnable() { 
    public void run() { 
     int counter = 0; 

     while (counter < 10) { 
      lblDisplay.setText("Completed " + Integer.toString(counter)); 
      try { 
       Thread.sleep(1000); 
       final int finalCounter = counter; 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         lblDisplay.setText("Completed " + finalCounter); 
        } 
       }); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(Increment.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      counter++; 
     }  
    } 
}).start(); 

Das ist ein bisschen komplizierter ist als Ich mag, während der Swing-Timer aussehen könnte :

int delay = 1000; 
new Timer(delay, new ActionListener() { 
    private int count = 0; 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (count < 10) { 
      lblDisplay.setText("Completed " + counter); 
     } else { 
      ((Timer) e.getSource()).stop(); // stop the Timer 
     } 
     counter++; 
    } 
}).start(); 

Das ist einfacher und sicherer als das vorherige.

+0

Hallo danke für die Hilfe :) – Jan

Verwandte Themen