2016-07-03 11 views
1

でInvalidatorListenerを削除します。JavaFXのラムダ式私はこのコードを使用しています

renameWindow.showingProperty().addListener(new InvalidationListener() { 
       @Override 
       public void invalidated(Observable observable) { 

        //Remove the Invalidator Listener 
        renameWindow.showingProperty().removeListener(this); 

       } 
      }); 

を、私はラムダの方法でやりたいと私が使用します。

renameWindow.showingProperty().addListener(listener->{ 
       renameWindow.showingProperty().removeListener(this); 
      }); 

と私は多分、リスナーのエラー原因を取得していますObservableインターフェイスか何ですか?lambda式を使用してこれを行います。これはどのように行うことができますか?lambdaを使用してInvalidationListenerを削除する方法

+0

問題は何ですか?あなたはそれをテストしましたか?それはエラーを出しますか?あれば何のエラー?例えば。あなたはあなたが探している答えをもう少し説明できますか? – n247s

+0

@ n247はい2番目のエラーはコンパイルされません。 – GOXR3PLUS

答えて

2

thisは、コードを含むクラスのインスタンスであり、ラムダ式自体ではありません。

jls-15.27.2: Lambda Body

は、匿名クラスの宣言に登場するコードとは異なり、名前の意味と参照の宣言のアクセシビリティに沿って、ラムダ本体に登場thissuperキーワードは、周囲と同じですコンテキスト(ラムダパラメータに新しい名前が導入されている点を除いて)

したがって、あなたはremoveListener方法のいずれが適用されないことを意味する、InvalidationListenerまたはChangeListenerを実装していないパラメータとしてオブジェクトをremoveListenerを呼び出すようにしようとしています。

ラムダ式への参照を取得する唯一の方法は、ラムダ本体が実行されたときにと評価されたラムダ本体からの参照にアクセスすることです。

それをフィールドに割り当てます。

private InvalidationListener listener = observable -> renameWindow.showingProperty().removeListener(this.listener); 
+0

私はInvalidationListenerリスナーを行う必要があります=リスナー - > {/ /ここにコード};それは最後の行を意味するものですか? 。 – GOXR3PLUS

+0

このプロパティは、偶数renameWindow.showingProperty()のaddListenerようなリスナーを(取得する方法を提供していない観察 - > { \t \t \t \t \t renameWindow.showingProperty()のremoveListener(renameWindow.showingProperty()getListener() ); \t \t \t \t});それは1つの行のコードだけかもしれません..なぜ我々は、メソッドのプロパティ()にアクセスすることはできません? – GOXR3PLUS

+2

プロパティは、情報隠蔽の原則のためにリスナーを取得するメソッドを提供しません(ユーザーは** else **がプロパティをリッスンしていることを知りません)。リスナーを別の場所に保管する必要があります。 'ReadOnlyBooleanProperty'(' showing'など)は、2つの 'removeListener'メソッドを提供します:1つは' InvalidationListener'パラメータを持ち、もう1つは 'ChangeListener 'パラメータを持ちます。使用している引数が 'this'で、周囲のコンテキストが' InvalidationListener'や 'ChangeListener 'にも割り当てられないので、コンパイル時にエラーが発生します。 – fabian

関連する問題