【问题标题】:Cannot add element to ObservableList (UnsupportedOperationException) in JavaFX [duplicate]无法将元素添加到 JavaFX 中的 ObservableList (UnsupportedOperationException) [重复]
【发布时间】:2016-11-06 02:38:46
【问题描述】:

初始起点

我有一个现有的List 1000 个Person 对象,我想插入一个Extractor 以侦听任何Person 对象中的属性更改(此ObservableList 稍后将附加到@987654326 @)。

所以我的代码是这样的:

ObservableList<Person> observablePersons = FXCollections.observableList(personlist,
    personextractor);

错误信息

但是当我尝试向这个 ObservableList observablePersons 添加一个新的人对象时,我遇到了这个错误:

run:
Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at com.sun.javafx.collections.ObservableListWrapper.doAdd(ObservableListWrapper.java:101)
    at javafx.collections.ModifiableObservableListBase.add(ModifiableObservableListBase.java:151)
    at java.util.AbstractList.add(AbstractList.java:108)
    at test.listchangelistener.listChangeDemo.main(listChangeDemo.java:72)
Java Result: 1

您能告诉我为什么会遇到此错误消息吗?我的 java 版本是 jdk1.8.0_91 (32-Bit)

人物类

package test.listchangelistener;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

class Person {

    private final IntegerProperty age = new SimpleIntegerProperty();
    private final StringProperty name = new SimpleStringProperty();

    public Person(String name, Integer age) {
        setName(name);
        setAge(age);
    }

    public int getAge() {
        return age.get();
    }

    public final void setAge(int value) {
        age.set(value);
    }

    public IntegerProperty ageProperty() {
        return age;
    }

    public String getName() {
        return name.get();
    }

    public final void setName(String value) {
        name.set(value);
    }

    public StringProperty nameProperty() {
        return name;
    }

    @Override
    public String toString() {
        return "Person{" + "age=" + age.get() + ", name=" + name.get() + '}';
    }

}

测试代码

package test.listchangelistener;

import java.util.Arrays;
import java.util.List;
import javafx.beans.Observable;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.util.Callback;


public class listChangeDemo {
    public static void main(String[] args) {

        Person p1 = new Person("Ted", 26);
        Person p2 = new Person("Anne", 19);

        // just a simple list
        List<Person> persons = Arrays.asList(p1, p2);

        // extractor to observe change of person properties
        Callback<Person, Observable[]> extractor = (Person p) -> {
            return new Observable[]{
                p.ageProperty(),
                p.nameProperty()
            };
        };

        // make list observable and attach extractor
        ObservableList<Person> observablePersons = FXCollections.observableList(persons, extractor);

        // create listchangeListener for observableList
        ListChangeListener listener = (ListChangeListener) (ListChangeListener.Change c) -> {
            while (c.next()) {
                if (c.wasAdded()) {
                    System.out.println("these were added: ");

                    List addedSubList = c.getAddedSubList();
                    addedSubList.forEach((Object t) -> {
                        System.out.println("added Person: " + t);
                    });
                } else if (c.wasRemoved()) {
                    System.out.println("these were removed");

                    List removedSubList = c.getRemoved();
                    removedSubList.forEach((Object t) -> {
                        System.out.println("removed Person: " + t);
                    });

                } else if (c.wasUpdated()) {
                    System.out.println("these were updated");

                    System.out.println("Updated elements are: "
                            + c.getList().subList(c.getFrom(), c.getTo()));
                }
            }
        };

        // attach listchangeListener to observableList
        observablePersons.addListener(listener);

        // testing changes
        observablePersons.add(new Person("Siegfried", 10));

    }
}

【问题讨论】:

  • 我认为这个问题不应该被标记为重复。虽然根本问题最终是相同的,但情况不同。在我看来,在这种情况下添加可观察列表使其成为一个独特的问题

标签: java arrays list javafx


【解决方案1】:

问题出在你的支持List的创建上:

List<Person> persons = Arrays.asList(p1, p2);

如果你看看javadoc of Arrays.asList

返回由指定数组支持的固定大小的列表。

仔细一看,你得到了一个UnsupportedOperationException,因为List.add()是一个可选操作

抛出: UnsupportedOperationException - 如果此列表不支持添加操作。

您可以将后备列表的创建更新为:

List<Person> persons = new ArrayList<Person>(Arrays.asList(p1, p2));

不同之处在于返回的ArrayList 是传递的ArrayList 的精确、独立副本,因此上述限制在这种情况下不再有效。

你也可以看看这个问题,它深入解释了这个话题:

Difference between Arrays.asList(array) vs new ArrayList<Integer>(Arrays.asList(ia)) in java

【讨论】:

  • 嗨 DVarga!非常感谢您的快速回复!是的,我完全忽略了 Arrays.asList() 的限制。我真是太愚蠢了。无论如何,非常感谢!
猜你喜欢
  • 2017-01-25
  • 1970-01-01
  • 2017-01-28
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 2018-01-21
相关资源
最近更新 更多