2017-03-21 11 views
1

でChangeListenerを追加:理解が、私は次のソースからいくつかのコードを理解しようとしていますテーブルビュー

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(...)メソッドを介して行われます。これは、うまくいくデータモデルから対応するデータオブジェクトを取得します。だから私の理解から私はおそらく、私は自分のTableViewで正しいsetItems(...)をしなかった場合、例外を提起するだろう。

これまでのところ正しいですか?はい、私はフォローアップの質問を持っている場合は

は:ReadOnlyObjectPropertyObservableとの両方が方法addListenerを持ってObservableValue両方実装しています。可能であれば、Lambda-Expressionは、addListener(...)メソッドのいずれかの引数になる可能性のある2つの機能インタフェースの2つのメソッドのパラメータのリストをチェックすることで正しく解決されますか?その点は私にはやや複雑なようだ。

答えて

1

selectionModel.selectedItemPropertyReadOnlyObjectProperty<T>です。ここで、TTableView<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)機能を呼び出すことです。

私の理解から、もし私が正しいsetItems(...)を私のTableViewでやっていなかったら、おそらく例外が発生するでしょう。

項目を設定しなかった場合、ユーザーは表の項目を決して選択できないため、選択項目がnullから変更されることはなく、変更リスナーは決して変更されないため、選択項目変更リスナーから例外が発生することはありません火災。

ReadOnlyObjectPropertyは、どちらもメソッドaddListenerを持つObservableとObservableValueの両方を実装しています。 addListener(...)メソッドのいずれかの引数になる可能性がある2つの可能な関数インタフェースの2つのメソッドのパラメータのリストをチェックすることで、Lambda-Expressionが正しく解決されるのは正しいですか?

はい。ラムダがwhich is complicated in compiler implementationを使用する方法を解決する方法は、アプリケーションプログラマのユーザビリティの観点からは、パラメータを数えればいいです:1つのパラメータであればInvalidationListenerが定義されており、3つのパラメータであればChangeListenerです定義されている。

overloaded methodとしてChangeListener、もう1つはInvalidationListenerであるため、2つのaddListener(...)メソッドがあります。両者の違いは微妙で、explained by the developer of the interfacesです。リスナーで新しい値を知る必要がある場合はChangeListenerを使用し、そうでない場合はInvalidationListenerを使用することをお勧めします。

+0

申し訳ありません申し訳ありませんが、返信が遅れており、これを私に明確に説明してくれてありがとうございます。私は明らかに、例外の一部を今までの私のように終わりまでは考えていませんでした。あなたは "アプリケーションプログラマのユーザビリティの観点"と言う。私はこの深みをどの程度深く掘り下げなければならないのか、それがちょうどもっと意味をなさない場所であるのかは分かりません。この時点で、選択と選択の変更が現時点での「表面」の下にどのように引き渡されているかを処理するコードを見ないことは私にとっては普通のことですか? – Wolfone

関連する問題