Объединить модификации из ObservableList в оригинальную коллекцию - PullRequest
0 голосов
/ 13 мая 2019

Я настраиваю ListView из списка Observable, в который вводится другая коллекция (в данном случае, связанный список).Итак, я нашел в этом ответе , как сделать так, чтобы элементы представления списка были удалены из него (я не совсем уверен, удаляются ли они и из 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 Ответ

0 голосов
/ 13 мая 2019

Короткий ответ - нет. Вы можете обновить исходный список на основе изменений, которые происходят в ObservableList, но не наоборот.

Причина в том, что ObservableList уведомляет наблюдателей об изменениях, произошедших в коллекции.

Вы можете обновить список источников следующим образом:

Обновлено

В приведенном ниже примере есть 3 различных способа устранения неоднозначности лямбда, вам явно следует использовать только один.

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 неудобным, поскольку вы можете иметь (как в этом случае) одно и то же имя метода с разными сигнатурами методов, поэтому вы должны сообщить компилятору, какой из них вы используете (либо сделав параметры однозначными) или буквально указав функциональный интерфейс, который вы хотите передать как лямбда.

Например, в addListener of Observable обычно есть специальный слушатель для конкретного изменения этого подкласса и InvalidationListener для всех, поэтому вы должны сообщить компилятору, какой из 2 вы выбираете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...