2017-02-09 3 views
0

を並べ替え:アイテムの追加と削除ListChangeListener.Change:どのように適切に処理するように更新してのJavaDocからアイテム

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); 

コードの最後の行はリストにあるどの要素変更しない、または彼らがでているが、プロパティを変更するためにの要素の1つ。だからこの変更は更新を起こすでしょう。


Outer.thisは何を意味するのでしょうか?

これは単に周囲のクラスの現在のオブジェクト(クラス名がOuterであると仮定されています)への参照です。すなわち、ListChangeListenerという匿名の内部クラス実装の現在のオブジェクトではありません。 What is the difference between Class.this and this in Java(および他の多くの情報)を参照してください。ドキュメント内のコードスニペットのコンテキストは、ObservableListを実装し、独自のObservableListインスタンス(デコレータパターン)を実装するクラスであると考えられます。それはリストのインスタンスを監視し、それを同期して更新します。

+0

多くの説明に感謝します!アウターに関するもう1つの質問です。 コードは 'Outer.this.remove(remitem)'と 'Outer.this.add(additem)'ではないはずですか? – kerner1000

+1

私の解釈では、より直感的なコードをお勧めします。おそらく考えは、周囲のクラス( 'Outer')が何らかのリスナーであり、コードが、追加され削除されたアイテムにリスナーを登録/登録解除しているということでしょう。ドキュメントに意図された内容が正確ではない。 –

関連する問題