Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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
在对模型进行更改时更新JavaFX表_Java_Javafx_Tableview - Fatal编程技术网

在对模型进行更改时更新JavaFX表

在对模型进行更改时更新JavaFX表,java,javafx,tableview,Java,Javafx,Tableview,我使用的是一个由渲染器对象的ObservableList支持的TableView,其设置如下: private ObservableList<Renderer> renderers = FXCollections.observableArrayList(); @FXML private TableView<Renderer> renderersTable; @FXML private TableColumn<Renderer, String> nameCol

我使用的是一个由渲染器对象的ObservableList支持的TableView,其设置如下:

private ObservableList<Renderer> renderers = FXCollections.observableArrayList();

@FXML
private TableView<Renderer> renderersTable;
@FXML
private TableColumn<Renderer, String> nameColumn;
@FXML
private TableColumn<Renderer, Boolean> approvedColumn;

@FXML
private void initialize() {
    nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
    approvedColumn.setCellValueFactory(new PropertyValueFactory<>("approved"));
    renderersTable.setItems(renderers);
}
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class Renderer extends Model {
    private String name;
    private boolean approved;
    // ...
}
我有一个通过按下按钮从UI调用的函数,它包含如下内容:

@FXML
private void approveSelectedRenderers() {
    List<Renderer> selectedRenderers = new ArrayList<>();
    selectedRenderers.addAll(renderersTable.getSelectionModel().getSelectedItems());

    for (Renderer renderer : selectedRenderers) {
        renderer.setApproved(true);
        renderers.set(renderers.indexOf(renderer), renderer);
        Thread.sleep(3000); // Simulate slowly talking to the network.
    }
}

我本来希望每3秒钟在每一行上看到一次对approved的更改,但是,它会执行所有行,并且只有在这之后才会更新UI。为什么呢?如何更新UI?

看起来所有渲染都是在FX线程上进行的。这将阻止用户界面,直到所有处理完成,然后将更新

要查看长时间运行的流程,请使用任务或服务,并在其更新回调中更新UI


您还可以使用Platform.runLater从后台运行的线程发回UI线程。

所有渲染都应该在FX线程中进行,不是吗?是的,应该-但是您线程。sleep正在暂停FX线程。因此,您可以在后台更新您的模型,并使用Platform.runLater将这些更新推送到线程,在下一个脉冲中,这些更新将在该线程上渲染。