2017-02-09 1 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() 메서드가 있습니다.


업데이트는 정확히 무엇을 의미합니까?

요소에 속한 속성이 변경되면 목록이 업데이트되지만 동일한 요소는 목록에 같은 순서로 유지되지만 업데이트됩니다. 예를 들어, 클래스 업데이 트를 발광 할 수 있습니다 목록의 요소에 setValue()를 호출

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

을 부여. documentation에는 업데이트가 "선택 사항"이며 모든 목록에서 해고되지 않을 수도 있음을 알 수 있습니다.

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

어떤 순서가에있는 목록에있는, 또는 어떤 요소가 변경되지 않는 코드의 마지막 줄은하지만 속성을 변경합니다 특히, extractor로를 만들고 업데이트를 발생 목록을 얻으려면 요소 중 하나의. 따라서이 변경으로 인해 업데이트가 실행됩니다.


Outer.this 무엇을 의미합니까?

이것은 주변 클래스의 현재 개체 (클래스 이름이 Outer 인 것으로 가정 됨)에 대한 참조입니다. 즉 익명의 내부 클래스 구현의 현재 객체가 ListChangeListener이 아닙니다. What is the difference between Class.this and this in Java (및 기타 다수)을 참조하십시오. 설명서의 코드 스 니펫에 대한 컨텍스트는 ObservableList을 구현하고 고유 한 ObservableList 인스턴스 (데코레이터 패턴)를 유지하는 클래스로 생각됩니다. 그것은 목록 인스턴스를 관찰하고 동기화되어 계속 업데이트됩니다.

+0

많은 설명에 감사드립니다! 아우터에 관한 또 하나의 질문입니다. 코드는'Outer.this.remove (remitem)'과'Outer.this.add (additem)'이 아닌 것으로해야합니까? – kerner1000

+1

내 해석에 따르면 더 직관적 인 코드를 제안합니다.아마도 그 생각은 주변 클래스 ('Outer')가 어떤 종류의 리스너이고, 코드는 추가되거나 제거 된 항목에 리스너를 등록/등록 취소하는 것입니다. 문서의 의도가 정확히 무엇인지 확신 할 수 없습니다. –

관련 문제