UI在应用程序进行一些计算时冻结

时间:2015-04-29 11:35:21

标签: java multithreading javafx tableview

我有java fx应用程序,有很多tableviews。我们如何在javafx tableview中知道有数据绑定,它在两个方向上工作。因此,当我的应用程序使用tableviws UI中的数据进行计算时,冻结了,因为我的应用程序不断更新tableviews(ObservableList)中的数据。我确实试过使用Platform.RunLater,但它并没有帮助我。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

Platform.runLater本质上延迟你的runnable - 但它将再次在UI线程上运行,因此在执行期间阻止每个用户输入。

解决方案很简单,use a worker thread

Task task = new Task<Void>() {
    @Override public Void call() {
        static final int max = 1000000;
        for (int i=1; i<=max; i++) {
            if (isCancelled()) {
               break;
            }
            updateProgress(i, max);
        }
        return null;
    }
};
ProgressBar bar = new ProgressBar();
bar.progressProperty().bind(task.progressProperty());
new Thread(task).start();

虽然建议使用ExecutorService类,因为它允许更加可控的行为:http://java-buddy.blogspot.de/2012/06/example-of-using-executorservice.html