您好我想就此问题提出任何建议。
我想在标签或任何有利于它的组件中以HH:MM:SS格式(每秒刷新一次)显示当前时间。
有什么建议吗?
编辑:有人要求代码..所以我把它放在这里以更好地描述问题。 "我当时没有代码我想要实现的是简单的GUI日记,在其中一个标签中,我想显示剩余时间,直到最近的事件和我要显示的另一个标签像钟表每秒刷新一次。我需要它来让剩余的时间工作。我能想到的只是创建新的线程来完成它并刷新时钟,但我在JavaFX中使用多线程并不是那么先进。所以我想知道是否有人可以建议我使用比多线程更复杂的东西(我不知道如何将该线程实现到JavaFX组件中)"
答案 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();