2017-09-27 5 views
0

나는 visible 속성에 리스너를 추가하고 속성이 더 이상 보이지 않을 때 리스너를 제거하려는 특별한 경우가 있습니다. 청취자가 한 번만 발사하고 나서 제거해야합니다.리스너가 실행될 때 리스너 제거

즉,이 변수 리스너가 초기화되지 않았을 수 있음을 알려줍니다 그러나

ChangeListener<Boolean> listener= (obs, ov, nv) -> { 
    if(!nv){ 
     //do my processing 
     node.visibleProperty().removeListener(listener);     } 
     } 
    }; 
node.visibleProperty().addListener(listener); 

. 그것을 null로 만든 다음, 그것을 만들면 효과적이지 않다는 문구가됩니다.

이것이 가능합니까?

답변

1

대신 지역 변수의, 인스턴스 변수를 listener 할 수 있습니다, 또는 당신이 (있는 당신이 자신을 참조하는 키워드 this을 사용할 수 있습니다) 익명의 내부 클래스를 사용할 수 있습니다 :

ChangeListener<Boolean> listener = new ChangeListener<Boolean>() { 
    @Override 
    public void changed(ObservableValue<? extends Boolean> obs, Boolean ov, Boolean nv) { 
     if (! nv) { 
      node.visibleProperty().removeListener(this); 
     } 
    } 
}; 
node.visibleProperty().addListener(listener); 
+0

감사합니다 나는 람다 대신 내부 클래스를 사용한다고 생각조차하지 않았다. –

+0

@purringpigeon 아, 오늘의 젊은이. 내가 어렸을 때 람다 식 등도 없었어. –

+0

젊음? 나는 이것을 20 년 이상 해왔다. 나는 막 돌아 오는 것을 생각하지 않은 람다에 지금까지 갔다. 하하. –