2017-11-23 2 views
1

JavaFx가 청취자를 처리하는 방법에 대해 궁금합니다. ObservableValue. 나는 일반적으로 청취자에 대한 몇 지워지지 않은 일이 있습니다JavaFx : 청취자 및/또는 바인딩 처리

  • 어떻게 자바 FX는 같은 값에 여러 청취자를 처리합니까? 같은 obsValue에 여러 청취자를 추가 할 수 있다는 것을 알았 으면 트리거 순서는 무엇입니까? FIFO처럼?
  • 동일한 리스너 (동일한 인스턴스)를 동일한 객체에 두 번 추가하면 어떻게됩니까? 두 번 추가됩니까? 그렇다면 두 번 트리거됩니까? 아니면 어떻게 작동하는지 모르겠습니다.
  • 청취자를 바인딩으로 바꿀 수있는 경우가 있고 그 반대 인 경우가 있지만 더 효과적 인 경우가 있습니다. 더 나은 바인딩, 또는 더 나은 수신기를 추가하려면?

청취자와 바인딩을 사용하여 잠시 동안 사용하고 있습니다. (적어도 내가 아는 것 같아서 :) :) 그런 다음 사용 방법에 관심이 없습니다. 좀 더 복잡한 청취 또는 바인딩을하기 위해 필자는 필자가 작성한 것과 같은 몇 가지 사항을 명확히하고 필자가 효과적으로 사용하고 있는지, 불필요한 메모리 누수가 없는지 확인하고자한다.

이 도메인에 대한 설명이나이 문서에 대한 답변을 어디에서받을 수 있습니까?

답변

3

javaFx가 동일한 값으로 여러 수신기를 처리하는 방법은 무엇입니까? 내가 아는 것처럼 같은 obsValue에 여러 청취자를 추가 할 수 있습니다. 그러면 트리거 순서는 무엇입니까? FIFO처럼?

같은 수신기 (동일한 인스턴스)를 동일한 객체 인 에 두 번 추가하면 어떻게됩니까? 두 번 추가됩니까? 그렇다면 을 두 번 트리거합니까? 아니면 어떻게 작동하는지 모르겠습니다.

우리가 해답의 한 부분에 대한 문서를 살펴 보자 :

ObservableValue<T>.addListener(ChangeListener<? super T> listener);

때마다 의 값이 ObservableValue 변경을 통지합니다 ChangeListener를 추가합니다.

동일한 수신기가 두 번 이상 추가되면 에 두 번 이상 통보됩니다. 즉, 의 고유성을 확인하기위한 검사가 이루어지지 않습니다.

동일한 실제 ChangeListener 인스턴스가 다른 ObservableValues에 대해 안전하게 에 등록 될 수 있습니다.

명령문의 굵은 부분은 위가 n 시간을 해고하게됩니다 같은 ChangeListenern 시간을 추가, 우리에게 우리가 알아야 할 모든 것을 알려줍니다.

ObservableValue 인터페이스는 ChangeListener이 이미 있는지 확인하기위한 작업을 지정하지 않습니다. 운이 좋을 수도 있고 구현이 당신에게이 메커니즘을 제공한다는 것을 알 수 있지만, 실제로는 그렇게 많이 사용되지 않습니다.당신은 중복을 추가하지 않는 보장하기 위해 ChangeListener 다음을 수행 할 수 있습니다 순서의 관점에서

ChangeListener<...> myListener = ...; 
someProperty.removeListener(myListener); 
someProperty.addListener(myListener); 

는 순서를 지정하지 않는 ObservableValue 인터페이스 자체를 실행.

JavaFX 라이브러리에 포함 된 표준 Property 클래스를 보면. SimpleDoubleProperty 인 경우 추가 된 순서대로 해고됩니다. SimpleDoubleProperty과 같은 클래스에서 사용되는 약간 복잡한 메커니즘에 어떻게 이것이 신속하게 이루어 졌는지 설명하기는 어렵습니다. 자세한 내용은 ExpressionHelper 클래스를 참조하십시오.

사용자가 직접 ObservableValue 인터페이스를 구현하려는 경우 (Javadoc에서 권장하지 않지만) 직접 실행 순서를 지정할 수 있습니다.


내가 바인딩 및 반대와 수신기를 교체 할 수 있습니다 때 경우가 알고

하지만, 이는 더 효과적이다? 바인드하는 것이 더 좋으며 리스너를 추가 하시겠습니까? propertyB가 변경 될 때 함께 Property<T> 객체를 결합 할 때, 예를 들어, 당신이 결합되면 이에

바인딩이 일반적으로 사용된다 propertyBpropertyA에 (즉 propertyA.bind(propertyB))에이어서, propertyA도 변경된다. 바인딩은 양방향 일 수도 있습니다.

그래서 변경 사항을 적용하려면 Property에 바인드를 사용하는 것이 좋습니다. 그러나 속성은 바인딩을 통해 하나의 다른 속성 만 참조합니다. (가) 위의 경우가 아니라면 여러 속성을 바인딩하려면 당신은 (자신의 바인딩을 통해) 또는 여러 바인딩을 용이하게하는 클래스 (예를 들어, DoubleBinding)

를 사용하여 링크 목록처럼 그들을 체인 데이지 수하는 Listener를 추가합니다. 첫 번째 포인트, 하나 더 질문을 Using JavaFX Properties and Binding

+0

덕분에 상세한 답 :

또한이 리소스를 볼 수 있도록 할 수있는 방법이 없다는 것을 내가'ObservableValue'에 한 번 리스너를 추가 한 경우, 다음 같은 리스너 다시 추가되지 않기를 바란다. 같은 인스턴스를 의미합니다. 나는 실제로 그것을 모른다 * 안전하게 등록 된 *에 대한 노트는 javadoc에 있음을 의미한다. – Sunflame

+1

알림 순서와 관련하여 @Sunflame : 지정되지 않은 항목이 존재하지 않습니다.) 그런 사양을 찾았습니까 (내 마음 속에서 본 것으로 생각했지만 지금은 찾을 수 없다)거나 어떤 가정 (읽기 : 구현 된) 순서에 의존합니다. 당신의 코멘트에서 당신이 의미하는 바를 이해하지 못한다 : 코드에 리스너를 추가하는 것이므로 두 번 덧붙이는지 알 수있다. – kleopatra

+0

예, 이벤트가 발생하여 리스너를 속성에 추가하는 경우처럼, 그때부터 그 건물의 변화를 듣고 싶습니다만, 그 사건이 다시 해고되는지, 그리고 이미 다시 듣지 않기 위해 청취자를 이미 소유지에 추가했는지 확인하고 싶습니다. – Sunflame