Chi*_*ddi 7 java arrays javafx list
初始起点
我有一个List1000个Person对象,我想插入一个Extractor来监听任何Person对象中的属性更改(ObservableList稍后将附加到a TableView).
所以我的代码就像:
ObservableList<Person> observablePersons = FXCollections.observableList(personlist,
personextractor);
Run Code Online (Sandbox Code Playgroud)
错误信息
但是当我尝试向这个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
Run Code Online (Sandbox Code Playgroud)
您能否告诉我为什么会遇到此错误消息?我的java版本是jdk1.8.0_91(32位)
人类
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() + '}';
}
}
Run Code Online (Sandbox Code Playgroud)
测试代码
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));
}
}
Run Code Online (Sandbox Code Playgroud)
DVa*_*rga 12
问题来自于您的支持的创建List:
List<Person> persons = Arrays.asList(p1, p2);
Run Code Online (Sandbox Code Playgroud)
如果你看一下Arrays.asList的javadoc:
返回由指定数组支持的固定大小的列表.
仔细看看你得到了UnsupportedOperationException,因为List.add()是一个可选操作:
抛出:UnsupportedOperationException - 如果此列表不支持add操作.
您可以将支持列表的创建更新为:
List<Person> persons = new ArrayList<Person>(Arrays.asList(p1, p2));
Run Code Online (Sandbox Code Playgroud)
不同之处在于返回的ArrayList是传递的精确,独立的副本,因此在这种情况下上述限制不再有效.
您还可以查看这个深入解释此主题的问题:
java中Arrays.asList(array)与新ArrayList <Integer>(Arrays.asList(ia))的区别
| 归档时间: |
|
| 查看次数: |
5916 次 |
| 最近记录: |