在对模型进行更改时更新JavaFX表
我使用的是一个由渲染器对象的ObservableList支持的TableView,其设置如下:在对模型进行更改时更新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
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将这些更新推送到线程,在下一个脉冲中,这些更新将在该线程上渲染。