Проблема в том, что вы используете Arrays.asList(Object...)
. Этот метод:
Возвращает список фиксированного размера, подкрепленный указанным массивом.
Из-за этого возвращаемый List
не поддерживает такие операции, как add
или remove
. Вместо этого вы бы изменили такой список с помощью метода set
. Первые два метода по своей природе требуют списка переменного размера. Реализация Bindings.bindContent
явно пытается использовать эти неподдерживаемые методы при синхронизации списков.
Изменить это:
this.persons = Arrays.asList(
new Person("Jacob", "Smith", this),
new Person("Isabella", "Johnson", this),
new Person("Ethan", "Williams", this),
new Person("Emma", "Jones", this),
new Person("Michael", "Brown", this));
К этому:
persons = new ArrayList<>();
persons.add(new Person("Jacob", "Smith", this));
persons.add(new Person("Isabella", "Johnson", this));
persons.add(new Person("Ethan", "Williams", this));
persons.add(new Person("Emma", "Jones", this));
persons.add(new Person("Michael", "Brown", this));
Примечание. В вашем текущем коде префикс this
не требуется. Но вы все равно можете использовать его, если хотите.
Примечание № 2: См. @ комментарий Пагбо .
В основном, убедитесь, что вы используете List
, который поддерживает операции add
и remove
.
Возможно, вам интересно, почему вызов Bindings.bindContent(List,ObservableList)
приводит к вызову remove
. Это потому, что этот метод возвращает:
Привязка содержимого [гарантирует], что List
содержит те же элементы, что и ObservableList
. Если содержимое ObservableList
изменится, List
будет обновлено автоматически.
Другими словами, List
обновляется в соответствии с ObservableList
. При этом сначала создается привязка, очищается List
, а затем добавляются все элементы ObservableList
.