JavaFX GUI 多线程问题

标签 java multithreading javafx

我有一个 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/

相关文章:

java - 如何解决找不到 CatalogManager.properties 错误

multithreading - C++ 11条件变量

JavaFX - 为什么 LineChart 在几次绘图后重复颜色?

java - JavaFX 中的一段自由流动文本是否可以有一个链接?

solaris - 多线程 printf 与 write(2) 缓冲

javafx - 如何在JavaFX中设置 ListView 边框

java - 如何修改 "Elevens"纸牌游戏以适应不同的标准?

java - HttpsURLConnections 默认主机名 validator

java - 在 Java 中用循环填充 hashmap

java - RejectedExecutionException 的原因可能是什么