2017-02-09 54 views
0

根据JavaDoc:ListChangeListener.Change:如何正确处理更新和置换项目

ObservableList theList = ...; 

theList.addListener(new ListChangeListener<Item>() { 
    public void onChanged(Change<tem> c) { 
     while (c.next()) { 
      if (c.wasPermutated()) { 
        for (int i = c.getFrom(); i < c.getTo(); ++i) { 
          //permutate 
        } 
       } else if (c.wasUpdated()) { 
          //update item 
       } else { 
        for (Item remitem : c.getRemoved()) { 
         remitem.remove(Outer.this); 
        } 
        for (Item additem : c.getAddedSubList()) { 
         additem.add(Outer.this); 
        } 
       } 
      } 
     } 
    }); 
} 

添加和删除项目是直线前进,但对于//update item// permutate

我怎么知道哪些项目已被其他项目排列?

更新意味着什么?它只是再次将相同的项目添加到列表中?

又是怎么回事

for (Item remitem : c.getRemoved()) { 
remitem.remove(Outer.this); 
} 
or (Item additem : c.getAddedSubList()) { 
additem.add(Outer.this); 
} 

是什么Outer.this意思?

回答

1

如何知道哪些项目已被其他项目置换?

该更改有一个getPermutation()方法,该方法描述元素如何置换。


是什么更新意味着什么?

如果属于某个元素的属性发生更改,但列表中的元素仍保留在列表中(以相同顺序),则更新列表。例如,给定的一类

public class Item { 

    private final IntegerProperty value = new SimpleIntegerProperty(); 

    public final IntegerProperty valueProperty() { 
     return value ; 
    } 

    public final int getValue() { 
     return valueProperty().get(); 
    } 

    public final void setValue(int value) { 
     valueProperty().set(value); 
    } 

    public Item(int value) { 
     setValue(value); 
    } 
} 

调用列表中的要素的setValue()可以触发一个更新。请注意,documentation指出更新是“可选”,可能不会被所有列表触发。具体来说,以获得触发更新列表,以及一个extractor创建:

ObservableList<Item> list = FXCollections.observableArrayList(
    item -> new Observable[] {item.valueProperty()}); 

list.addAll(new Item(1), new Item(2), new Item(3)); 

list.addListener((Change<? extends Item> c) -> { 
    while (c.next()) { 
     if (c.wasUpdated()) { 
      System.out.println("Items from "+c.getFrom()+" to "+c.getTo()+" changed"); 
     } 
    } 
}); 

list.get(1).setValue(42); 

的代码不会改变哪些元素是在列表中,或者为了他们中的最后一行,但更改属性的元素之一。所以这个改变会引发更新。


是什么Outer.this意思?

它只是对周围类的当前对象(假定类名为Outer)的引用;即不是ListChangeListener的匿名内部类实现的当前对象。见What is the difference between Class.this and this in Java(和许多其他)。我认为文档中代码片段的上下文应该是一个类,它实现了ObservableList并且维护了自己的ObservableList实例(装饰器模式)。它观察列表实例并更新自身以与其保持同步。

+0

非常感谢您的解释!关于Outer.this还有一个问题。 代码不应该是'Outer.this.remove(remitem)'和'Outer.this.add(additem)'intead吗? – kerner1000

+1

我想在我的解释中,你建议的代码会更直观。也许这个想法是,周围的类('Outer')是某种监听器,代码注册/注销监听器以添加和删除项目。不完全确定文档中的意图是什么。 –