すべてのリスナーを観測可能な値にするにはどうすればよいですか?クラスを拡張して、addListener
とremoveListener
のメソッドをオーバーライドしてセットに格納することができました。しかし、このセットはすでに何らかの形で観測可能な値の中に格納されているはずです。どのように私はそのセットを得ることができますか?監視対象のすべてのリスナーを観測可能な値に戻す
答えて
リスナリストに直接アクセスすることはできませんが、デバッガ(私はIntelliJを使用しています)を使用している場合、ObservableProprtyを次のように見ていると表示されます。 (あなたがスマートな男だ
)//SimpleFloatProperty we want to find its Listeners
FloatPropertyBase f=ampPS.currentProperty();
Object value;
ChangeListener[] list;
ChangeListener changeListener=null;
Field field = null;
try {
field = FloatPropertyBase.class.getDeclaredField("helper");
field.setAccessible(true);
value = field.get(f);
try {
field = value.getClass().getDeclaredField("listener");
field.setAccessible(true);
changeListener =(WeakChangeListener)field.get(value);
}catch (NoSuchFieldException e) {
e.printStackTrace();
}
try {
field = value.getClass().getDeclaredField("changeListeners");
field.setAccessible(true);
list =(ChangeListener[])field.get(value);
}catch (NoSuchFieldException e) {
e.printStackTrace();
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
、あなたがあなたのケースに収まるようにする方法を知っているよ結果::)十分に明確
(お知らせジ1つのリスナーまたは1以上)
間fference私は値
public static ChangeListener[] getChangeListeners(ObservableValue observableValue){
Object value;
ChangeListener[] list=null;
ChangeListener changeListener=null;
Field field = null;
try {
if(observableValue instanceof SimpleFloatProperty){
field = FloatPropertyBase.class.getDeclaredField("helper");
}
else if(observableValue instanceof SimpleBooleanProperty){
field = BooleanPropertyBase.class.getDeclaredField("helper");
}
else if(observableValue instanceof SimpleIntegerProperty){
field = IntegerPropertyBase.class.getDeclaredField("helper");
}
field.setAccessible(true);
value = field.get(observableValue);
try {
field = value.getClass().getDeclaredField("listener");
field.setAccessible(true);
changeListener =(ChangeListener)field.get(value);
}catch (NoSuchFieldException e) {
//e.printStackTrace();
}
try {
field = value.getClass().getDeclaredField("changeListeners");
field.setAccessible(true);
list =(ChangeListener[])field.get(value);
}catch (NoSuchFieldException e) {
//e.printStackTrace();
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if(list!=null){
return list;
}
else {
ChangeListener[] changeListeners = new ChangeListener[1];
changeListeners[0]=changeListener;
return changeListeners;
}
}
のいくつかのタイプのための例を追加していると私はそれを呼び出す:
SimpleBooleanProperty booleanProperty = new SimpleBooleanProperty(true);
SimpleFloatProperty simpleFloatProperty = new SimpleFloatProperty(0);
SimpleIntegerProperty simpleIntegerProperty = new SimpleIntegerProperty(1);
booleanProperty.addListener(changeListener);
simpleFloatProperty.addListener(changeListener);
simpleIntegerProperty.addListener(changeListener);
simpleIntegerProperty.addListener(changeListener);
System.out.println(getChangeListeners(booleanProperty).length);
System.out.println(getChangeListeners(simpleFloatProperty).length);
System.out.println(getChangeListeners(simpleIntegerProperty).length);
私は警告を受けるが、仕事は終わった!
long Java 9リリースそのジグソーパズルがjavafxの内部に問題になるようにアクセスしました – ayvango
field = value.getClass()。getDeclaredField( "listener"); 私はそれをインポートすることはできませんが、私はそれをオブジェクトを取得した後getClassを使用することができます(私はこのコードでJava 9を使用します) –
ObservableValuesを追加するために私の答えを編集しました。 ObservableValueインターフェイスで直接動作することができますが、必要に応じて値を追加することができます... –
- 1. 角ユニットテスト観測可能/カルマの対象
- 2. オブジェクトを別の観測対象の中に観測可能から返す
- 3. ObservableArray子観測可能な変更監視
- 4. RxJS:同じルートを使用していない観測可能な観測値観測可能な値
- 5. フラット化対象物の観測可能な配列を確認する
- 6. 観測可能なデータを観測可能な配列にプッシュノックアウト
- 7. 観測可能な配列内のノックアウト観測可能なオブジェクト
- 8. 観測可能な値を別の観測値で使用する方法は?
- 9. RxJS:別の観測値から観測可能なデフォルト値を設定する
- 10. KnockoutJS - 観測可能なオブジェクトの観測可能配列
- 11. は、別の観測可能なものに観測可能です。
- 12. ネストされたobservableから観測可能な戻り値
- 13. アレイ内のすべてのプロパティを観測可能にする
- 14. 観測可能なサブスクリプション - 次のメソッドを無視する
- 15. 観測可能な配列を配列に戻す
- 16. 観測可能な値をフィルタ
- 17. 観測可能なサブスクリプションを別の観測可能なサブスクリプションにネストすることは可能ですか?
- 18. rxjs - 複数の入力に対して観測可能な単一の入力または観測ごとに観測可能なもの
- 19. RXJSで観測可能な内部観測オブザーバブルの受信可
- 20. Rxjs:値または観測値から観測可能な作成の略語
- 21. RxSwit - 観測可能なドライバがエラーを無視する
- 22. 観測可能
- 23. ノックアウト観察可能な観測可能な配列の配列
- 24. 同じ観測可能性のサブスクライブで観測値の前の値を取得
- 25. 観測可能に戻る前にデータを操作する
- 26. 観測可能な角型
- 27. 観測可能なサポートレスキュープル
- 28. 観測可能なレイジーランダムジェネレータ
- 29. 観測可能なタイムアウト
- 30. 監視対象ファイルに対するwebpackカスタムコマンドの変更
メソッドは、追加されたリスナーを見つけるためのメソッドを提供しないObservableValueインターフェースで宣言されています(実際に特定のオブザーバーを削除したかどうかを示すbooleanも返しません)。私はこれが意図的に行われていると確信しています(情報が隠れています;すべてのリスナーの 'Set'を得ることができれば、それらを削除することもできます...)。おそらくあなたはラッキーです。プロパティクラスは 'XYZPropertyBase'を拡張し、リスナーを使ってリスナーへのアクセスを強制することができますが、この方法ではAPIが行うべきことではないことをしています... – fabian