2017-04-06 1 views
0

Ich versuche, einen Code in Java zu schreiben, um die Zeit zu zählen. Ich habe threadSleep verwendet, um eine Sekunde Verzögerung zu machen. Wenn ich es laufe, friert es für eine Zeit (3 Sekunden zum Beispiel) und dann zeigt es das Ergebnis in ms an. Ich möchte nur wissen, was ich tun sollte, um ein Einfrieren zu verhindern und Text-Label-Update jede Sekunde.Zeitzähler in Java mit Thread Schlaf und While-Schleife

import java.awt.*; 
import javax.swing.*; 

public class Test2 extends JFrame 
{ 
    private JButton btn=new JButton("Start"); 
    private JLabel lbl=new JLabel("00"); 

    public Test2() { 
     super("Timer"); 
     setLayout(new FlowLayout()); 
     setSize(400, 500); 
     add(lbl); 
     add(btn); 
     btn.addActionListener(e->{   
      startimer();   
     }); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    private void startimer() { 
     long start=System.currentTimeMillis(); 
     int i=1; 
     while(i<4) { 
      try{ 
       Thread.sleep(1000); 
       long now=System.currentTimeMillis(); 
       lbl.setText("the counter in ms:" + (now-start)); 
       i=i+1; 
      } catch(Exception e){} 
     } 
    } 

     public static void main(String[] args) { 
      new Test2().setVisible(true); 
     } 
} 
+3

Verwendung ein anderes Thema – stinepike

+0

Insbesondere führen Sie den Zähler-Code in einem Daemon-Thread, so dass es endet, wenn Ihre Anwendung beendet wird. – 4castle

Antwort

0

benötigen Sie Swing-Arbeiter für Ihre Zwecke zu verwenden:

class Test2 extends JFrame { 
    private JButton btn=new JButton("Start"); 
    private JLabel lbl=new JLabel("00"); 
    public Test2(){ 
     super("Timer"); 
     setLayout(new FlowLayout()); 
     setSize(400, 500); 
     add(lbl); 
     add(btn); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     btn.addActionListener(e-> new SwingWorker<Object, String>() { 
      @Override 
      public Object doInBackground() { 
       long start = System.currentTimeMillis(); 
       for(int i = 0; i < 4; i++) { 
        try { 
         Thread.sleep(1000); 
         publish("the counter in ms: " + 
           (System.currentTimeMillis() - start)); 
        } catch(Throwable e) { 
         e.printStackTrace(); 
        } 
       } 
       return null; 
      } 

      @Override 
      protected void process(final java.util.List<String> chunks) { 
       if (!chunks.isEmpty()) { 
        lbl.setText(chunks.get(chunks.size() - 1)); 
       } 
      } 
     }); 
    } 
} 
+0

Entschuldigung. es funktioniert nicht für mich. –

+0

Entschuldigung, nach der 'SwingWorker'-Instanz habe ich vergessen,' start'-Methode aufzurufen - hast du es versucht? – ZhenyaM