我正在从一个可观察的列表中设置一个ListView,该列表有另一个集合的输入(在本例中是一个链表)。因此,我在这个答案中找到了如何使列表视图的项从中移除(我不太确定它们是否也从ObservableList中移除),那么还有什么可能的方法可以在两个集合(即ObservableList和原始集合)中进行修改呢?
下面是一段代码:
LinkedList<> shoppingCart; //In the code this has been initialized before.
public static class XCell extends ListCell<Product> {
HBox hb = new HBox();
Label name = new Label("");
Pane p = new Pane();
Button d = new Button("X");
public XCell() {
super();
File f = new File("src/style/main.css");
hb.getStylesheets().clear();
hb.getStylesheets().add("file:///" + f.getAbsolutePath().replace("\\", "/"));
hb.getChildren().addAll(nombre, p, d);
HBox.setHgrow(p, Priority.ALWAYS);
d.getStyleClass().add("red-btn");
d.setOnAction(event -> getListView().getItems().remove(getItem()));
}
@Override
protected void updateItem(Product item, boolean empty) {
super.updateItem(item,empty);
setText(null);
setGraphic(null);
if (item != null && !empty) {
nombre.setText(item.toString());
setGraphic(hb);
}
}
}
private void showCart(ActionEvent event){
ObservableList<Product> cart = FXCollections.observableArrayList(shoppingCart);
ListView<Alimento> lv = new ListView<>(cart);
lv.setCellFactory(param -> new XCell());
Scene sc = new Scene(lv);
Stage st = new Stage();
st.setScene(sc);
st.setTitle("Pizza! -- Cart");
st.show();
}
简短的回答是否定的。您可以根据ObservableList中发生的更改更新原始列表,但不能反过来。
原因是ObservableList通知观察者集合发生的更改。
您可以像这样更新源列表:
public class SomeController {
public class SomeObject {}
private List<SomeObject> sourceList;
@FXML
private ListView<SomeObject> aView;
public void init(){
aView.getItems().addAll(sourceList);
// You can use method (which is strictly typed)
aView.getItems().addListener(this::updateSource);
// You can specify the type of the arguments
aView.getItems().addListener((Change<? extends SomeObject> changes)->{
ObservableList<? extends SomeObject> lst = changes.getList();
sourceList.clear();
sourceList.addAll(lst);
});
// You can specify the type of the functional interface
aView.getItems().addListener((ListChangeListener<SomeObject>) changes->{
ObservableList<? extends SomeObject> lst = changes.getList();
sourceList.clear();
sourceList.addAll(lst);
});
}
private void updateSource(Change<? extends SomeObject> chg) {
ObservableList<? extends SomeObject> data = chg.getList();
sourceList.clear();
sourceList.addAll(data);
}
}
尝试添加到集合时出现“Collection was modified”异常 问题出在“添加”方法上。如果我注释掉该部分,则不会引发异常。重要的是要注意,我已经尝试将foreach重写为for循环并添加“ToList()”以形成。链接。在所有情况下都会引发相同的异常。我在站点的其他部分使用这种完全相同的模式没有问题,这就是为什么这如此令人沮丧。这也适用于“创建”。问题只影响“编辑”操作。 其他相关代
合并 在执行pull之后,进行下一次push之前,如果其他人进行了推送内容到远程数据库的话,那么你的push将被拒绝。 这种情况下,在读取别人push的变更并进行合并操作之前,你的push都将被拒绝。这是因为,如果不进行合并就试图覆盖已有的变更记录的话,其他人push的变更(图中的提交C)就会丢失。 合并的时候,Git会自动合并已有的变更点!不过,也存在不能自动合并的情况。在下一个页面,我们会为大
我有一个对象列表: 每一个都包含一个Object2列表。我试图遍历objList,以便从每个Object1各自的Object2列表中删除Object2的特定实例: 这会引发错误:“集合已修改;枚举操作可能无法执行。” 我不明白的是,我正在从Object2List中删除一个对象,它没有被枚举。为什么会抛出此错误?
问题内容: 我在下面有此代码,并且通过执行以下行来获取ConcurrentModificationException: 代码: 堆栈是: 恰好在foreach行上: 我不明白为什么会发生此错误,因为我没有修改列表。 问题答案: 要知道,是 不是抄袭 收集数据,但只有包装原始集合在一个特殊的包装。因此,如果您修改原始集合,则会出现此错误。 如果要创建真正独立的不可修改的集合实例:
我知道这在生产中绝不应该发生,但我正在试图理解一些关于spliterator的错综复杂的细节,并撞见了下面这个“谜题”(至少对我来说是个谜题): (代码段%1) 这段代码按预期打印(cough我已经预期了一个,但我理解行为cough),即,它在列表上创建了一个拆分器,当列表有6个元素时,该拆分器将被拆分。 我不明白的是以下几点: (片段2) 我预计这段代码会失败,但它确实失败了,因为在的行上有一个
问题内容: 假设我有一个Integer列表,并且我在列表上使用Java 8 forEach方法将其值加倍。说我有以下代码: 至于forEach方法,请使用Consumer并调用它接受方法。我在上面的代码运行后打印列表,原始列表没有变化。 据我了解,Stream不会改变源,但在这里我只是在每个元素上调用accept方法。 谢谢你在advace 问题答案: forEach不更改列表的原因归结为规范: