gpt4 book ai didi

JavaFX GUI 多线程问题

转载 作者:行者123 更新时间:2023-11-30 07:40:56 25 4
gpt4 key购买 nike

我有一个 JavaFX 应用程序,它只有一个场景,其中一个标签应该以“hh:mm:ss”格式显示当前时间,另一个标签应该以“12/12/12”或“12-12-12”。两者都可以。在 Controller 中,我创建了两个在初始化时调用的方法,以启动一个线程来更新两个标签。这个想法是每 500 毫秒更新一次时钟,每一分钟或 60000 毫秒更新一次日期。下面显示了我正在使用的代码,除了 sleep 时间和正在更新的标签之外,它们基本上相同。这是错误和我的代码:

WARNING: Uncaught throwable in javafx concurrent thread pool
java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4


private void startClockUpdateService() {
Service<Void> clockBackgroundThread = new Service<Void>(){

@Override
protected Task<Void> createTask() {
return new Task<Void>(){

@Override
protected Void call() throws Exception {
while(true){
SimpleDateFormat sdfClock = new SimpleDateFormat("hh:mm:ss");
String date1 = sdfClock.format(new Date());
timeLabel.setText(date1);
Thread.sleep(500);
}
}

};
}

};
clockBackgroundThread.restart();
}

private void startDateUpdateService() {
Service<Void> clockBackgroundThread = new Service<Void>(){

@Override
protected Task<Void> createTask() {
return new Task<Void>(){

@Override
protected Void call() throws Exception {
while(true){
SimpleDateFormat sdfClock = new SimpleDateFormat("MM-dd-yyyy");
String date1 = sdfClock.format(new Date());
dateLabel.setText(date1);
Thread.sleep(60000);
}
}

};
}

};
clockBackgroundThread.restart();
}

我注意到格式“hh:mm:ss”似乎导致了问题,因为当我将其交换为日期格式“MM-dd-yyyy”时,一切似乎都工作正常。有什么想法吗?

最佳答案

从另一个线程更新 UI 线程时,您应该始终使用 Platform.runLater

对于定期操作,请考虑使用 Timeline :

KeyFrame update = new KeyFrame(Duration.seconds(0.5), event -> { 
// update label here. You don't need to use Platform.runLater(...), because Timeline makes sure it will be called on the UI thread.
});
Timeline tl = new Timeline(update);
tl.setCycleCount(Timeline.INDEFINITE);
tl.play();

关于JavaFX GUI 多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34707666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com