2016-06-10 4 views
3

JavaFx BooleanProperty에 리스너를 추가, 제거 및 다시 추가하려고 시도하지만 작동하지 않습니다. 여기 JavaFX 속성 제거 수신기가 작동하지 않습니다.

는 다음과

공용 클래스 PropListenerTest {

BooleanProperty test = new SimpleBooleanProperty(false); 

public PropListenerTest() { 
    System.out.println("\nTest 1\tadd the listener"); //NON-NLS 
    test.addListener(this::onChangeTest); 
    test.set(true); 
    test.set(false); 

    System.out.println("\nTest 2\tremove the listener, but not possible! Why?"); //NON-NLS 
    test.removeListener(this::onChangeTest); 
    test.set(true); 
    test.set(false); 

    System.out.println("\nTest 3\tAdd the listener again, but now i have two listener but I want only one!"); //NON-NLS 
    test.addListener(this::onChangeTest); 
    test.set(true); 
    test.set(false); 
} 

private void onChangeTest(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
    System.out.println("observable = [" + observable + "], oldValue = [" + oldValue + "], newValue = [" + newValue + "]"); //NON-NLS 
} 

public static void main(String[] args) { 
    new PropListenerTest(); 
} 

결과 내 코드입니다

내가 거기에 어떤 결과 일 수 없으며 시험 3한다 시험이 생각
Test 1 add the listener 
observable = [BooleanProperty [value: true]], oldValue = [false], newValue = [true] 
observable = [BooleanProperty [value: false]], oldValue = [true], newValue = [false] 

Test 2 remove the listener, but not possible! Why? 
observable = [BooleanProperty [value: true]], oldValue = [false], newValue = [true] 
observable = [BooleanProperty [value: false]], oldValue = [true], newValue = [false] 

Test 3 Add the listener again, but now i have two listener but want only one 
observable = [BooleanProperty [value: true]], oldValue = [false], newValue = [true] 
observable = [BooleanProperty [value: true]], oldValue = [false], newValue = [true] 
observable = [BooleanProperty [value: false]], oldValue = [true], newValue = [false] 
observable = [BooleanProperty [value: false]], oldValue = [true], newValue = [false] 

그 테스트 1에서와 같은 결과를 나타내야합니다. 내가 뭘 잘못하고 있는지 모르는 사람이 나를 도울 수 있습니까?

감사합니다.

답변

5

메서드 참조는 매번 별개의 개체를 만드는 것처럼 동작합니다.

은 잘못된 것

ChangeListener<Boolean> changeListener1 = new ChangeListener() { 
    @Override 
    public void changed(Observable<? extends Boolean> obs, Boolean oldValue, Boolean newValue) { } 
}; 

ChangeListener<Boolean> changeListener2 = new ChangeListener() { 
    @Override 
    public void changed(Observable<? extends Boolean> obs, Boolean oldValue, Boolean newValue) { } 
}; 

다음 changeListener1 == changeListener2changeListener1.equals(changeListener2) 일을 상상해보십시오.

마찬가지로,

ChangeListener<Boolean> changeListener1 = this::onChangeTest ; 
ChangeListener<Boolean> changeListener2 = this::onChangeTest ; 

는 거짓 인 changeListener1 == changeListener2 될 것이다.

당신이

ChangeListener<Boolean> changeListener = this::onChangeTest ; 

System.out.println("\nTest 1\tadd the listener"); //NON-NLS 
test.addListener(changeListener); 
test.set(true); 
test.set(false); 

System.out.println("\nTest 2\tremove the listener, but not possible! Why?"); //NON-NLS 
test.removeListener(changeListener); 
test.set(true); 
test.set(false); 

System.out.println("\nTest 3\tAdd the listener again, but now i have two listener but I want only one!"); //NON-NLS 
test.addListener(changeListener); 
test.set(true); 
test.set(false); 

을 할 경우 예상대로 작동합니다.

+0

감사합니다. 위대한 작품은 미안하다. –

관련 문제