javaFx가 동일한 값으로 여러 수신기를 처리하는 방법은 무엇입니까? 내가 아는 것처럼 같은 obsValue에 여러 청취자를 추가 할 수 있습니다. 그러면 트리거 순서는 무엇입니까? FIFO처럼?
같은 수신기 (동일한 인스턴스)를 동일한 객체 인 에 두 번 추가하면 어떻게됩니까? 두 번 추가됩니까? 그렇다면 을 두 번 트리거합니까? 아니면 어떻게 작동하는지 모르겠습니다.
우리가 해답의 한 부분에 대한 문서를 살펴 보자 :
ObservableValue<T>.addListener(ChangeListener<? super T> listener);
때마다 의 값이 ObservableValue
변경을 통지합니다 ChangeListener를 추가합니다.
동일한 수신기가 두 번 이상 추가되면 에 두 번 이상 통보됩니다. 즉, 의 고유성을 확인하기위한 검사가 이루어지지 않습니다.
동일한 실제 ChangeListener 인스턴스가 다른 ObservableValues에 대해 안전하게 에 등록 될 수 있습니다.
명령문의 굵은 부분은 위가 n
시간을 해고하게됩니다 같은 ChangeListener
n
시간을 추가, 우리에게 우리가 알아야 할 모든 것을 알려줍니다.
ObservableValue
인터페이스는 ChangeListener
이 이미 있는지 확인하기위한 작업을 지정하지 않습니다. 운이 좋을 수도 있고 구현이 당신에게이 메커니즘을 제공한다는 것을 알 수 있지만, 실제로는 그렇게 많이 사용되지 않습니다.당신은 중복을 추가하지 않는 보장하기 위해 ChangeListener
다음을 수행 할 수 있습니다 순서의 관점에서
ChangeListener<...> myListener = ...;
someProperty.removeListener(myListener);
someProperty.addListener(myListener);
는 순서를 지정하지 않는 ObservableValue
인터페이스 자체를 실행.
JavaFX 라이브러리에 포함 된 표준 Property
클래스를 보면. SimpleDoubleProperty
인 경우 추가 된 순서대로 해고됩니다. SimpleDoubleProperty
과 같은 클래스에서 사용되는 약간 복잡한 메커니즘에 어떻게 이것이 신속하게 이루어 졌는지 설명하기는 어렵습니다. 자세한 내용은 ExpressionHelper
클래스를 참조하십시오.
사용자가 직접 ObservableValue
인터페이스를 구현하려는 경우 (Javadoc에서 권장하지 않지만) 직접 실행 순서를 지정할 수 있습니다.
내가 바인딩 및 반대와 수신기를 교체 할 수 있습니다 때 경우가 알고
하지만, 이는 더 효과적이다? 바인드하는 것이 더 좋으며 리스너를 추가 하시겠습니까? propertyB
가 변경 될 때 함께 Property<T>
객체를 결합 할 때, 예를 들어, 당신이 결합되면 이에
바인딩이 일반적으로 사용된다 propertyB
propertyA
에 (즉 propertyA.bind(propertyB)
)에이어서, propertyA
도 변경된다. 바인딩은 양방향 일 수도 있습니다.
그래서 변경 사항을 적용하려면 Property
에 바인드를 사용하는 것이 좋습니다. 그러나 속성은 바인딩을 통해 하나의 다른 속성 만 참조합니다. (가) 위의 경우가 아니라면 여러 속성을 바인딩하려면 당신은 (자신의 바인딩을 통해) 또는 여러 바인딩을 용이하게하는 클래스 (예를 들어, DoubleBinding
)
를 사용하여 링크 목록처럼 그들을 체인 데이지 수하는 Listener
를 추가합니다. 첫 번째 포인트, 하나 더 질문을 Using JavaFX Properties and Binding
덕분에 상세한 답 :
또한이 리소스를 볼 수 있도록 할 수있는 방법이 없다는 것을 내가'ObservableValue'에 한 번 리스너를 추가 한 경우, 다음 같은 리스너 다시 추가되지 않기를 바란다. 같은 인스턴스를 의미합니다. 나는 실제로 그것을 모른다 * 안전하게 등록 된 *에 대한 노트는 javadoc에 있음을 의미한다. – Sunflame
알림 순서와 관련하여 @Sunflame : 지정되지 않은 항목이 존재하지 않습니다.) 그런 사양을 찾았습니까 (내 마음 속에서 본 것으로 생각했지만 지금은 찾을 수 없다)거나 어떤 가정 (읽기 : 구현 된) 순서에 의존합니다. 당신의 코멘트에서 당신이 의미하는 바를 이해하지 못한다 : 코드에 리스너를 추가하는 것이므로 두 번 덧붙이는지 알 수있다. – kleopatra
예, 이벤트가 발생하여 리스너를 속성에 추가하는 경우처럼, 그때부터 그 건물의 변화를 듣고 싶습니다만, 그 사건이 다시 해고되는지, 그리고 이미 다시 듣지 않기 위해 청취자를 이미 소유지에 추가했는지 확인하고 싶습니다. – Sunflame