簡體   English   中英

JavaFx:偵聽器和/或綁定處理

[英]JavaFx: Listener and/or binding handling

我只是想知道JavaFx如何處理ObservableValue的偵聽器。 關於監聽器,我總體上有一些不清楚的地方:

  • javaFx如何處理相同值的多個偵聽器? 據我所知,我可以將多個偵聽器添加到同一個obsValue中,那么觸發順序是什么? 喜歡在fifo嗎?
  • 如果將相同的偵聽器(相同的實例)兩次添加到同一對象,會被添加兩次,會發生什么? 如果是,那么它將觸發兩次? 或者我不確定它是如何工作的。
  • 我知道在某些情況下可以用綁定替換偵聽器,反之亦然,但是哪個更有效? 更好地綁定,還是更好地添加偵聽器?

我使用了一段時間的監聽器和綁定,所以我知道如何使用它們(至少我想我知道:)),然后我對如何使用它們不感興趣,因為我必須做一些更復雜的監聽或綁定,我想像我寫的那樣澄清一些要點,以確保我有效地使用它們,並且我不會發生任何不必要的內存泄漏。

我會接受此領域的任何解釋或任何好的文檔,在這些方面我可以從中找到答案。

javaFx如何處理相同值的多個偵聽器? 據我所知,我可以將多個偵聽器添加到同一個obsValue中,那么觸發順序是什么? 喜歡在fifo嗎?

如果將相同的偵聽器(相同的實例)兩次添加到同一對象,會被添加兩次,會發生什么? 如果是,那么它將觸發兩次? 或者我不確定它是如何工作的。

讓我們看一下答案的一部分的文檔:

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

添加一個ChangeListener,每當ObservableValue的值更改時,它就會被通知。

如果多次添加同一個偵聽器,則將多次收到通知。 即,不進行檢查以確保唯一性。

請注意,可以為不同的ObservableValues安全地注冊相同的實際ChangeListener實例。

上面語句的粗體部分告訴我們我們需要知道的所有內容,如果將相同的ChangeListener添加n次,則將被觸發n次。

ObservableValue接口未指定任何用於檢查ChangeListener已存在的操作。 您可能很幸運,發現實現確實為您提供了這種機制,但實際上並沒有太大用處。 為了確保您沒有添加重復的ChangeListener ,可以執行以下操作:

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

在執行順序方面, ObservableValue接口本身未指定順序。

查看JavaFX庫中包含的標准Property類,例如SimpleDoubleProperty ,將按照添加的順序觸發它們。 很難快速解釋如何通過諸如SimpleDoubleProperty類的類所使用的稍微復雜的機制來實現這一點。 查看ExpressionHelper類,以獲取有關如何完成此操作的更多詳細信息。

如果您自己實現ObservableValue接口(盡管Javadoc不建議這樣做),則可以指定自己的執行順序。


我知道在某些情況下可以用綁定替換偵聽器,反之亦然,但是哪個更有效? 更好地綁定,還是更好地添加偵聽器?

當您想將Property<T>對象綁定在一起時,通常使用綁定,因此,例如,如果將propertyB綁定到propertyA (即propertyA.bind(propertyB) ),則當propertyB更改時, propertyA也將更改。 綁定也可以是雙向的。

因此,如果您希望更改使用綁定來影響另一個Property ,則是有意義的。 但請注意,這些屬性僅通過綁定引用其他單個屬性。 要綁定多個屬性,您可以像鏈接列表一樣(通過它們的綁定)或通過使用促進多個綁定的類(例如DoubleBinding )來以菊花鏈方式鏈接它們。

如果不是上述情況,則添加Listener

另請參見此資源: 使用JavaFX屬性和綁定

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM