2017-03-21 64 views
1

我想了解從以下源的一些代碼:瞭解添加一個ChangeListener在TableView中

http://code.makery.ch/library/javafx-8-tutorial/part3/

具體的線路我仍然好奇的是以下之一:

personTable.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> showPersonDetails(newValue)); 

我相信我對javadoc的第一次理解是不正確的;尤其是在這部分([...].selectedItemProperty().[...]):

https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/SelectionModel.html#selectedItemProperty--

我問自己,爲什麼我們只添加一個監聽器,而我們可能有幾個數據對象,但現在我的理解如下,這將是很好的知道,如果它是正確的:

該文檔的含義是「selectedItem」本身是屬性(而不是底層數據!),它表示在運行時選擇/選擇更改的行,因此我們的偵聽器的更改方法是當用戶更改選定的行時引發。然後與底層數據模型的同步通過ChangeListener接口的change(...)方法進行,該方法從udnerlying數據模型獲取相應的數據對象以進行工作。所以根據我的理解,如果我沒有在我的TableView上執行正確的setItems(...),我可能會引發異常。

到目前爲止這是否正確?

如果是,我有一個後續問題:ReadOnlyObjectProperty既執行ObservableObservableValue,它們都有方法addListener。通過檢查兩個可能的函數接口中的兩個方法的參數列表來正確解析Lambda表達式是否正確,這兩個函數接口可能是參數爲addListener(...)方法之一的參數?這一點對我來說似乎相當複雜。

回答

1

selectionModel.selectedItemPropertyReadOnlyObjectProperty<T>其中T是支持您的TableView<T>item list中的元素類型。每當在TableView中選擇一個新項目時,selectedItemProperty的值將更改爲引用新項目。所選項目本身不是TableRow<T>,它只是對用於呈現該行的基礎數據項的引用。一般來說,作爲應用程序員,你通常不關心TableRow,它是一個可視化構造,而只是基礎數據。當用戶點擊表格中的一行時,TableView實現將selectedItemProperty設置爲選定的數據項目,然後觸發任何已在屬性上設置的更改偵聽器。

在makery示例中,T類型爲Person。所以這條線的後果:

personTable.getSelectionModel().selectedItemProperty().addListener(
    (observable, oldValue, newValue) -> showPersonDetails(newValue) 
); 

是調用showPersonDetails(Person person)功能,通過在選定的人,每當改變。

所以從我的理解我可能會引發一個異常,如果我沒有在我的TableView上做一個正確的setItems(...)。

No.如果你沒有設置任何項目,用戶永遠不能在表格上選擇一個項目,所以你永遠不會從選擇的項目更改監聽器中得到一個異常,因爲所選項目永遠不會從null改變,並且更改監聽器永遠不會火。

我有一個後續問題:ReadOnlyObjectProperty既實現了Observable又實現了ObservableValue,它們都有addListener方法。通過檢查兩個可能的函數接口中的兩個方法的參數列表(可能是addListener(...)方法之一的參數)來正確解析Lambda-Expression是否正確?

是的。 lambda如何解決使用哪種方法which is complicated in compiler implementation,但是從應用程序員可用性的角度來看,您可以只計算參數:如果它是一個參數,那麼定義一個InvalidationListener,如果它是3個參數,那麼ChangeListener是被定義。

有兩種addListener(...)方法,因爲它是overloaded method,一種是ChangeListener,另一種是InvalidationListener。兩者之間的差別很微妙,並且建議使用explained by the developer of the interfaces:「如果您需要知道偵聽器中的新值,請使用ChangeListener,否則使用InvalidationListener」。

+0

對不起,我很遲纔回復,非常感謝你向我澄清這一點!顯然,我認爲現在看來,這個例外部分直到最後。你說「應用程序員可用性的觀點」;我不確定我應該深入到多深,哪裏沒有任何意義。在這一點上,我認爲對於我來說,看看處理選擇和選擇變化如何處理我現在所處的「表面」之下的代碼是正常的嗎? – Wolfone

相關問題