gpt4 book ai didi

java - 将 ObservableList 中的修改合并到原始集合

转载 作者:行者123 更新时间:2023-12-02 05:44:42 24 4
gpt4 key购买 nike

我正在从 Observable 列表设置一个 ListView,该列表具有另一个集合的输入(在本例中为链接列表)。所以我在this answer中找到了如何使 ListView 的项目从其中删除(我不太确定它们是否也从 ObservableList 中删除),因此有任何可能的方法可以在两个集合(即 ObservableList 和原始集合)中进行修改 Collection )?

这是一段代码:

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 通知观察者集合发生的更改。

您可以像这样更新源列表:

已更新

在下面的示例中,有 3 种不同的方法来消除 lambda 的歧义,显然您应该只使用一种。

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);
}

}

相反,链表没有等效方法来通知观察者其更改。

方法多态性使lambda语法变得尴尬,因为您可以(如本例中)具有不同方法签名的相同方法名称,因此您必须让编译器知道您正在使用哪一个(要么通过使参数明确),要么从字面上指定您想要作为 lambda 传递的函数接口(interface)。

例如,Observable 的 addListener 通常既有针对该子类的特定更改的特定监听器,又有针对所有子类的 InvalidationListener,因此您必须让编译器知道您选择的是这两个中的哪一个。

关于java - 将 ObservableList 中的修改合并到原始集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56106972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com