2016-07-25 257 views
1

你好,我想问一下关于这个问题的任何建议。JavaFX每秒显示时间和刷新

我想在标签或任何对它有利的组件中以HH:MM:SS格式显示当前时间(每秒刷新一次)。

有什么建议吗?

编辑:有人问了一个代码..所以我把它放在这里,以更好地描述问题。 “我当时没有代码我想要实现的是简单的GUI日记,并且在其中一个标签中,我希望显示剩余的时间,直到最接近的事件,以及我希望显示的其他标签,如时钟,刷新每个时钟第二,我需要它来获得剩余的工作时间,我所能想到的就是创建新的线程来完成它并刷新时钟,但是我并不是那种高级的在JavaFX中使用多线程的人,所以我想知道是否有人可以给我建议与东西比多线程那么复杂(我不知道如何实现线程进入JavaFX组件)”

+0

你能告诉我你的代码。所以我可以看到任何更正。 –

+0

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

回答

0

要使用定时器解决你的任务,你需要实现TimerTask与您的代码,并使用Timer#scheduleAtFixedRate方法反复运行代码:

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

还要注意,调用任何UI操作必须Swing的UI线程(或FX UI线程,如果你正在使用JavaFX)来完成:

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); 
} 

在JavaFX的情况下,你需要在“FX更新外汇管制UI线程“而不​​是Swing之一。为了实现这一目标使用javafx.application.Platform#runLater方法,而不是SwingUtilities的

+0

谢谢,但这是多线程,我真的不知道如何在JavaFX GUI中实现它.. – MaraSimo

+0

你也可以检查这个问题http://stackoverflow.com/questions/34801227/fast-counting-timer-in-javafx –

+1

您正在从AWT事件调度线程更改JavaFX标签的文本。这违反了JavaFX线程规则,并可能会抛出'IllegalStateException'。 –

4

版本与时间轴:

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

帮助了我。不过,我会使用'LocalDateTime.now()'来代替当前的日期和时间 – Lulero