2014-04-28 3 views
13

새 ListChangeListener()를 람다와 함께 java8에 작성하려면 어떻게해야합니까?새 ListChangeListener <Item>()을 람다와 함께 쓰려면 어떻게해야합니까?

listItems.addListener(new ListChangeListener<Item>() { 
    @Override 
    public void onChanged(
     javafx.collections.ListChangeListener.Change<? extends Item> c) { 
     // TODO Auto-generated method stub 
    } 
}); 

이것은 내가 뭘하려 :

listItems.addListener(c->{}); 

그러나 일식 상태 :

메소드의 addListener (ListChangeListener)가 형 ObservableList에 대한 모호합니다. 로

리스트

선언 : ObservableList 이후

ObservableList<Item> listItems = FXCollections.observableArrayList(); 

답변

24

Observable 인터페이스에서 addListener(InvalidationListener)을 상속, 컴파일러는 호출하는 버전을 확인할 수 없습니다. 캐스트를 통해 람다의 유형을 지정하면이를 해결해야합니다. 유형을 지정하지 않고

listItems.addListener((ListChangeListener.Change<? extends Item> c) -> {/* ... */}); 
+8

'searchResultListItems.addListener ((ListChangeListener.Change는 C) -> {});' 까다로운 하나 힌트 – simonides

+0

의 트릭 들으했다. –

+0

위의 옵션을 ChangeListener와 함께 사용할 수 없습니다. PropertyListeners 사용 ... "람다 식의 서명이 변경된 기능 인터페이스 메서드의 서명 (ObservableValue, Object, Object)과 일치하지 않습니다." - 시도 할 때 : property.addListener ((ChangeListener) e -> ({/ * ... * /}))); – Lealo

3

이 코드는 작동합니다

listItems.addListener((ListChangeListener)(c -> {/* ... */})); 

당신은 명시 적으로 c의 유형을 지정할 수 있습니다.

listView.focusedProperty().addListener ((arg, oldVal, newVal) -> System.out 
     .printf ("ListView %s focus%n", (newVal ? "in" : "out of"))); 
+0

당신의 솔루션은 ListViews에서 작동하지만, focusedProperty가없는 ObservableLists에 대한 질문이있었습니다. – ktul