すべてのリスナーを観測可能な値にするにはどうすればよいですか?クラスを拡張して、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. ObservableArray子観測可能な変更監視
- 3. 観測可能な配列内のノックアウト観測可能なオブジェクト
- 4. RxJS:別の観測値から観測可能なデフォルト値を設定する
- 5. KnockoutJS - 観測可能なオブジェクトの観測可能配列
- 6. 観測可能な値をフィルタ
- 7. 観測可能なサブスクリプションを別の観測可能なサブスクリプションにネストすることは可能ですか?
- 8. 観測可能
- 9. 同じ観測可能性のサブスクライブで観測値の前の値を取得
- 10. 観測可能に戻る前にデータを操作する
- 11. 観測可能なレイジーランダムジェネレータ
- 12. 観測可能なサポートレスキュープル
- 13. 観測可能なタイムアウト
- 14. 監視対象ファイルに対するwebpackカスタムコマンドの変更
- 15. 最初に観測可能な2番目の観測可能な電波を最初に放射する
- 16. ngclassを観測可能な値にバインドする方法
- 17. ノックアウト:観測可能
- 18. RxJava観測可能
- 19. 観測可能なコレクションをフィルタリングする
- 20. のCoffeeScript、ノックアウト&観測可能
- 21. 1つのオブザーバブルに対して複数の観測可能なイベント
- 22. KnockoutJS:インデックスを使用して観測可能な配列の値にアクセスする
- 23. オブジェクトのプロパティで観測可能なAurelia
- 24. 角度2の観測可能な鎖
- 25. ホット観測可能なファーストエミッションのSwitchMap
- 26. 観測可能な範囲へのマッピング
- 27. Angular2で観測可能なオブジェクトのアクセスフィールド
- 28. Rxjs観測可能なサブスクリプションの数
- 29. 角度2の観測可能なサブオブジェクト
- 30. Angular2/Typescriptで観測可能な値をデバッグする方法は?
メソッドは、追加されたリスナーを見つけるためのメソッドを提供しないObservableValueインターフェースで宣言されています(実際に特定のオブザーバーを削除したかどうかを示すbooleanも返しません)。私はこれが意図的に行われていると確信しています(情報が隠れています;すべてのリスナーの 'Set'を得ることができれば、それらを削除することもできます...)。おそらくあなたはラッキーです。プロパティクラスは 'XYZPropertyBase'を拡張し、リスナーを使ってリスナーへのアクセスを強制することができますが、この方法ではAPIが行うべきことではないことをしています... – fabian