当前位置: 首页 > 知识库问答 >
问题:

将ObservableList的修改合并到原始集合

贝洲
2023-03-14

我正在从一个可观察的列表中设置一个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();
}

共有1个答案

翟俊茂
2023-03-14

简短的回答是否定的。您可以根据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不更改列表的原因归结为规范: