[英]JavaFx: Listener and/or binding handling
我只是想知道JavaFx如何處理ObservableValue
的偵聽器。 關於監聽器,我總體上有一些不清楚的地方:
我使用了一段時間的監聽器和綁定,所以我知道如何使用它們(至少我想我知道:)),然后我對如何使用它們不感興趣,因為我必須做一些更復雜的監聽或綁定,我想像我寫的那樣澄清一些要點,以確保我有效地使用它們,並且我不會發生任何不必要的內存泄漏。
我會接受此領域的任何解釋或任何好的文檔,在這些方面我可以從中找到答案。
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.