ListView不更新JavaFX中最近添加的条目

ListView不更新JavaFX中最近添加的条目,listview,javafx,observable,Listview,Javafx,Observable,我不久前遇到了这个问题,虽然我找到了解决它的方法,但我仍然很好奇为什么我的第一个实现没有工作。在列表视图中,选择的更改、添加和删除按预期进行。不过,更新只适用于列表的初始条目,而不适用于我稍后添加的条目 假设我有一个图书列表视图,它是以observeList作为源创建的。我添加了一个选择更改侦听器和一个列表更改侦听器,以使用回调监视添加和更新。最初,ObservableList中填充了一些书籍。当我修改这些条目时(例如修改书名),ListChangeListener将按预期启动,ListView

我不久前遇到了这个问题,虽然我找到了解决它的方法,但我仍然很好奇为什么我的第一个实现没有工作。在
列表视图中
,选择的更改、添加和删除按预期进行。不过,更新只适用于列表的初始条目,而不适用于我稍后添加的条目

假设我有一个图书列表视图,它是以
observeList
作为源创建的。我添加了一个选择更改侦听器和一个
列表更改侦听器
,以使用
回调
监视添加和更新。最初,ObservableList中填充了一些书籍。当我修改这些条目时(例如修改书名),ListChangeListener将按预期启动,ListView将反映这些更改

图书类:

公共课堂教材{
私有IntegerProperty id;
私有财产所有权;
公共书籍(){
this.id=新的SimpleIntegerProperty();
this.title=新的SimpleStringProperty();
}
//身份证
公共int getId(){
返回id.get();
}
public void setId(int id){
此.id.set(id);
}
公共整数属性idProperty(){
返回id;
}
//头衔
公共字符串getTitle(){
返回title.get();
}
public void setTitle(字符串名称){
此.title.set(名称);
}
公共财产所有权{
返回标题;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj){
返回true;
}
if(obj==null){
返回false;
}
如果(getClass()!=obj.getClass()){
返回false;
}
最终书籍其他=(书籍)obj;
返回Objects.equals(this.id,other.id);
}
@凌驾
公共字符串toString(){
返回title.get();
}
}
以及用于测试问题的主类:

公共类ListViewTest扩展应用程序{
私家书单;
私有int tmpIdSeq=100;//用于测试的临时自动生成ID
私有可观察列表createBookList(){
//为更新创建回调
回拨输出=
(b册)->新可观察[]{
b、 idProperty(),
b、 产权
};
//创建图书列表
List tmpList=new LinkedList();
//加几本书
对于(int i=2;i{
//打印当前和以前的选择
statusLbl.setText(“当前:
+(newValue!=null?newValue.getTitle():“”)
+,上一页:
+(oldValue!=null?oldValue.getTitle():“”);
}
);         
//将更改侦听器添加到ListView的可观察列表中
bookList.addListener(

(ListChangeListener.change还没有详细研究这个问题,但是您的
Book.equals()
方法看起来是错误的。
返回Objects.equals(this.id,other.id);
应该是
返回Objects.equals(this.getId(),other.getId())
这并不能解决问题。这看起来像一个bug?@James_D,好的。留下IDE自动插入的一个作为例子。我实际上检查了原始项目中的原语int。但不影响结果。这看起来确实像一个bug。
FXCollections.observableList(列表,提取器)
检查列表是否是
RandomAccessList
ArrayList
是,
LinkedList
不是)的实例,如果是,则委托给。如果不是,则委托给….在前者中,
doAdd()
方法将侦听器附加到提取器定义的属性;在后者中,则不附加侦听器。
private ObservableList<Book> createBookList() {
        // create the callback for updates
        ...
        // create the list of books
        ObservableList<Book> startList = 
                FXCollections.observableArrayList(extr);
        // add a few books
        for (int i=2; i<6; i++) {
            ...
            startList.add(b);
        }
        // return the observable list
        return startList;
    }