JavaFX每秒显示时间和刷新

时间:2016-07-25 11:32:54

标签: java time javafx timer

您好我想就此问题提出任何建议。

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

有什么建议吗?

编辑:有人要求代码..所以我把它放在这里以更好地描述问题。 "我当时没有代码我想要实现的是简单的GUI日记,在其中一个标签中,我想显示剩余时间,直到最近的事件和我要显示的另一个标签像钟表每秒刷新一次。我需要它来让剩余的时间工作。我能想到的只是创建新的线程来完成它并刷新时钟,但我在JavaFX中使用多线程并不是那么先进。所以我想知道是否有人可以建议我使用比多线程更复杂的东西(我不知道如何将该线程实现到JavaFX组件中)"

5 个答案:

答案 0 :(得分:8)

带时间轴的版本:

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

答案 1 :(得分:0)

有人可能会发现如何打印javaFx的日期和时间。

final Label clock = new Label();
final DateFormat format = DateFormat.getInstance();
final Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), 
new EventHandler() 
{
@Override  
    public void handle(ActionEvent event) 
    {
      final Calendar cal = Calendar.getInstance();
      clock.setText(format.format(cal.getTime());
    }
});

timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();

答案 2 :(得分:0)

   Label main_clock_lb = new Label();
    Thread timerThread = new Thread(() -> {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        while (true) {
            try {
                Thread.sleep(1000); //1 second
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            final String time = simpleDateFormat.format(new Date());
            Platform.runLater(() -> {
                main_clock_lb.setText(time);
            });
        }
    });   timerThread.start();//start the thread and its ok

答案 3 :(得分:-1)

要使用Timer解决您的任务,您需要使用代码实现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,您需要在&#34; FX UI线程&#34;上更新FX控件。而不是摆动一个。要使用javafx.application.Platform#runLater方法而不是SwingUtilities

答案 4 :(得分:-2)

    final Label clock = new Label();
    final DateFormat format = DateFormat.getInstance();
    final Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1),
            new EventHandler<ActionEvent>()
            {
                @Override
                public void handle(ActionEvent event)
                {
                    final Calendar cal = Calendar.getInstance();
                    clock.setText(format.format(cal.getTime()));
                }
            }));

    timeline.setCycleCount(Animation.INDEFINITE);
    timeline.play();