Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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,我有一个由可观察列表支持的TableView: private ObservableList<Renderer> renderers = FXCollections.observableArrayList(); @FXML private TableView<Renderer> renderersTable; @FXML private TableColumn<Renderer, String> nameColumn; @FXML private Table

我有一个由可观察列表支持的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(this.renderers);
}
在这段代码中,我从TableView中获取所有选定项并对其进行处理:

private void approveSelectedRenderers() {
    ObservableList<Renderer> selectedRenderers = renderersTable.getSelectionModel().getSelectedItems();

    for (Renderer renderer : selectedRenderers) {
        renderer.setApproved(true);
        renderers.set(renderers.indexOf(renderer), renderer);
    }
}
我启用了多个select,并且selectedrenders显示了适当的计数,但是循环只执行一次

如果我复制一份,像这样:

@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class Renderer extends Model {
    private String name;
    private boolean approved;
    // ...
}
private void approveSelectedRenderers() {        
    // Get all the selected renderers but copy them.
    List<Renderer> selectedRenderers = new ArrayList<>();          
    selectedRenderers.addAll(renderersTable.getSelectionModel().getSelectedItems());

    for (Renderer renderer : selectedRenderers) {
        renderer.setApproved(true);
        renderers.set(renderers.indexOf(renderer), renderer);
    }
}

它工作正常,所有项目都已处理。发生什么事?处理这个问题的适当方法是什么?

从您的另一个问题判断,您实际上是在修改TableView的支持可观察数据结构。这意味着您正在重置完整的选定可观察列表,或者正在重置备份数据结构中的渲染器。我有点惊讶它没有抛出ConcurrentModificationException

解决方案:在选定列表上循环时,不要修改备份数据结构。更新后也没有必要重置它们。如果将值类型boolean更改为SimpleBoleAnProperty,则可以使用CellFactory将其直接传递给TableView。更改SimpleBoleAnProperty的值将自动为您更新表


当无法使用SimpleBoleAnProperty时,还可以使用TableViewrefresh方法。请注意,它将重新填充整个TableView,而不仅仅是修改后的元素


进一步阅读:

数据结构的allRenderes是什么?它是一个单独的数据结构,还是TableView的可观察的后台数据结构?就像在你的另一个问题中一样,你不必做任何类似的事情。你没有发布的代码中的其他地方有错误,这让你相信你必须跳过这些不必要的障碍。@n247s:这是支持TableView的可观察到的。真的吗?因为这不是一个编程问题而否决和关闭?不-因为你没有做任何事情来回答这个问题;你在某处做错了什么。。。如果没有SSCCE或更新的术语,我们无法知道这可能是什么-与您的销售代表一起,您应该了解程序;请注意,它将重新填充整个TableView,而不仅仅是修改后的元素。AFAIK所要做的就是重新渲染可见的单元格。除非你的用户有一个巨大的屏幕,否则你不太可能看到超过20行左右的内容。但是我确实需要在选定的行上循环并修改它们。不这样做要么就是什么都不做,要么就是做我正在做的事情,就是复制一个副本。@Pablo您不需要复制列表来遍历它并修改它的内容。当您在没有复制此答案中解释的列表的情况下尝试代码时,代码无法工作的唯一原因是调用renders.set。。。在迭代过程中,它会更改正在迭代的列表。如果删除此调用,循环将按预期执行。如果按照Javadocs for TableColumn和PropertyValueFactory中的建议实现模型,则不需要renders.set。。。不管怎样打电话。