2016-07-25 22 views
1

Hallo, ich möchte um einen Rat zu diesem Problem bitten.JavaFX Anzeige von Zeit und Aktualisierung in jeder Sekunde

Ich möchte die aktuelle Zeit im Format HH: MM: SS (wird jede Sekunde aktualisiert) in einem Etikett oder einer anderen Komponente anzeigen, die dafür geeignet ist.

Irgendwelche Ratschläge?

EDIT: Jemand fragte nach einem Code .. so habe ich es hier für eine bessere Beschreibung des Problems. "Ich habe keinen Code für diese Zeit. Was ich versuche zu erreichen, ist ein einfaches GUI-Tagebuch. In einem der Labels möchte ich die verbleibende Zeit bis zum nächsten Event anzeigen und auf dem anderen Label möchte ich wie Uhren anzeigen, die alle aktualisieren 2. Ich brauche es, um die restliche Zeit arbeiten zu lassen.Alles, woran ich denken kann, ist das Erstellen eines neuen Threads, der es tut und die Uhr aktualisiert, aber ich bin nicht so weit fortgeschritten, Multithreading in JavaFX zu verwenden.So fragte ich mich, ob irgendjemand mich beraten kann mit etwas weniger kompliziert als Multithreading (ich weiß nicht, wie man das Gewinde in JavaFX Komponenten implementieren)“

+0

können Sie mir zeigen, Ihren Code. so kann ich für jede Korrektur sehen. –

+0

https://stackoverflow.com/questions/42383857/javafx-live-time-and-date/42384436#42384436 –

Antwort

0

Ihre Aufgabe lösen Timer verwenden Sie TimerTask mit Ihrem Code und verwenden Timer#scheduleAtFixedRate Methode implementieren müssen, dass Code wiederholt auszuführen:

Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     System.out.print("I would be called every 2 seconds"); 
    } 
}, 0, 2000); 

Beachten Sie auch, dass alle UI-Operationen Aufruf auf Swing-UI-Thread ausgeführt werden müssen (oder FX UI-Thread, wenn Sie JavaFX verwenden):

private int i = 0; 
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
    Timer timer = new Timer(); 
    timer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        jTextField1.setText(Integer.toString(i++)); 
       } 
      }); 
     } 
    }, 0, 2000); 
} 

Bei JavaFX Sie FX-Regler aktualisieren müssen auf „FX UI-Thread "statt Swing One. Um sicherzustellen, dass die Verwendung javafx.application.Platform#runLater Verfahren statt SwingUtilities

+0

Danke, aber das ist Multithreading und ich weiß nicht wirklich, wie Sie es in JavaFX GUI implementieren. – MaraSimo

+0

Sie kann diese Frage auch überprüfen http://stackoverflow.com/questions/34801227/fast-counting-timer-in-javafx –

+1

Sie ändern den Text eines JavaFX-Labels aus dem Thread AWT Event Dispatch. Dies verletzt JavaFX-Threading-Regeln und wird wahrscheinlich eine "IllegalStateException" auslösen. –

4

Version mit Timeline zu erreichen:

long endTime = ...; 
Label timeLabel = new Label(); 
DateFormat timeFormat = new SimpleDateFormat("HH:mm:ss"); 
final Timeline timeline = new Timeline(
    new KeyFrame(
     Duration.millis(500), 
     event -> { 
      final long diff = endTime - System.currentTimeMillis(); 
      if (diff < 0) { 
      // timeLabel.setText("00:00:00"); 
       timeLabel.setText(timeFormat.format(0)); 
      } else { 
       timeLabel.setText(timeFormat.format(diff)); 
      } 
     } 
    ) 
); 
timeline.setCycleCount(Animation.INDEFINITE); 
timeline.play(); 
+0

Hat mir geholfen. Allerdings würde ich stattdessen "LocalDateTime.now()" verwenden, um das aktuelle Datum und die Uhrzeit wiederherzustellen – Lulero