2017-02-09 58 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')是某種監聽器,代碼註冊/註銷監聽器以添加和刪除項目。不完全確定文檔中的意圖是什麼。 –