Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFXUI冻结问题_Java_Multithreading_Concurrency_Javafx 2 - Fatal编程技术网

JavaFXUI冻结问题

JavaFXUI冻结问题,java,multithreading,concurrency,javafx-2,Java,Multithreading,Concurrency,Javafx 2,我试图显示每个任务的进度和状态。每个任务通过一行表示到表视图中。每个任务在每个线程中并行执行。请参阅表视图的图像 对于“Progress”TableColumn我已将单元格工厂设置为呈现“ProgressBar” 但是现在我的JavaFX应用程序的UI在连续几次后冻结。有没有其他方法可以在后台线程中调用updateProgressbar(),在特定时间间隔后自动触发,而不冻结我的JavaFX应用程序的UI 我不知道我是否正确地更新了任务的状态,每个任务都在一个单独的线程中运行。如果我想借助ja

我试图显示每个任务的进度和状态。每个任务通过一行表示到
表视图中。每个任务在每个
线程中并行执行。请参阅
表视图的图像

对于“Progress”
TableColumn
我已将单元格工厂设置为呈现“ProgressBar”

但是现在我的
JavaFX
应用程序的UI在连续几次后冻结。有没有其他方法可以在后台线程中调用updateProgressbar(),在特定时间间隔后自动触发,而不冻结我的
JavaFX
应用程序的UI


我不知道我是否正确地更新了任务的状态,每个任务都在一个单独的线程中运行。如果我想借助
javafx.concurrent package
来实现这一点,那么有人能给我一些指导或流程吗?任务将包含哪些内容,服务类将包含哪些内容?我如何安排它o更新进度条?仅供参考:一次只允许5个线程并行执行。

编辑-

根据安迪先生的建议,直到我更新了我的代码,但仍然没有运气-

TableColumn tableColumn_Progress = new TableColumn("Progress");
        tableColumn_Progress.setCellValueFactory(new PropertyValueFactory<QueueData, Double>("progressBar"));
        tableColumn_Progress.setPrefWidth(100);

        Callback<TableColumn<QueueData, Double>, TableCell<QueueData, Double>> attachmentCellFactory = //
                new Callback<TableColumn<QueueData, Double>, TableCell<QueueData, Double>>() {
            @Override
            public TableCell call(final TableColumn param) {
                final ProgressBarTableCell cell = new ProgressBarTableCell() {
                    @Override
                    public void updateItem(Object item, boolean empty) {
                        super.updateItem(item, empty);
                    }
                };
                return cell;
            }
        };
        tableColumn_Progress.setCellFactory(attachmentCellFactory);

并且没有调用任何后台线程来更新UI,但运气不好。

据我所知,您正在翻转可见性以触发表单元格上的updateItem方法?这意味着任何数量的线程都可能试图每秒更改可见性并无休止地重新绘制

我知道您的实现已经走得很远了,但是JavaFX服务类已经实现了一个进度特性,您可以对其进行更新,这比您现在所做的要简单得多

如果有一个从线程更新的ProgressDouble属性,并将其绑定到ProgressBar.progressProperty()上,那么一切都将自动更新,这将更简单、更高效。这就是服务类的工作方式,但很容易自己实现

还要确保您正在处理线程,这很容易检查。在eclipse中调试,在调试透视图中,它将显示线程列表,确保它不会无限增长


对于调度ScheduledExecutor类的可运行签出,可以使用Executors.newScheduledThreadPool(numOfThreads)轻松创建它.

您的“QueueData”类应该具有设置现有进度的double属性的方法,似乎每次在setprogressBar(double sType)方法中设置进度状态时都在创建新的SimpleDoubleProperty

将此更新为-

 public void setprogressBar(Double sType) {
        this.progressBar.set(sType);
    }

只需在开始时创建一次progressBar对象,然后更新现有对象。

谢谢。我已根据您的建议更新了代码,但不起作用。我已编辑了我的问题并添加了代码。请向我演示如何使用progressBar以及在何处使用progressProperty()的示例;谢谢我不知道我的方法是否正确。如果我想在javafx.concurrent包的帮助下实现这一点,那么我该怎么做?任务中会有什么,服务类中会有什么?progressBar.progressProperty().bind(myService.progressProperty())应该将服务进度绑定到进度栏,并在从服务更新service.progressProperty()时自动更新。InterWeb上有一些关于服务的不错的教程。
TableColumn tableColumn_Progress = new TableColumn("Progress");
        tableColumn_Progress.setCellValueFactory(new PropertyValueFactory<QueueData, Double>("progressBar"));
        tableColumn_Progress.setPrefWidth(100);

        Callback<TableColumn<QueueData, Double>, TableCell<QueueData, Double>> attachmentCellFactory = //
                new Callback<TableColumn<QueueData, Double>, TableCell<QueueData, Double>>() {
            @Override
            public TableCell call(final TableColumn param) {
                final ProgressBarTableCell cell = new ProgressBarTableCell() {
                    @Override
                    public void updateItem(Object item, boolean empty) {
                        super.updateItem(item, empty);
                    }
                };
                return cell;
            }
        };
        tableColumn_Progress.setCellFactory(attachmentCellFactory);
DoubleProperty progressBar = null;

public DoubleProperty progressBarProperty() {
        return progressBar;
    }

    public Double getprogressBar() {
        return progressBar.get();
    }

    public void setprogressBar(Double sType) {
        this.progressBar = new SimpleDoubleProperty(sType);
    }
 public void setprogressBar(Double sType) {
        this.progressBar.set(sType);
    }