2016-05-11 13 views
1

すべてのリスナーを観測可能な値にするにはどうすればよいですか?クラスを拡張して、addListenerremoveListenerのメソッドをオーバーライドしてセットに格納することができました。しかし、このセットはすでに何らかの形で観測可能な値の中に格納されているはずです。どのように私はそのセットを得ることができますか?監視対象のすべてのリスナーを観測可能な値に戻す

+0

メソッドは、追加されたリスナーを見つけるためのメソッドを提供しないObservableValueインターフェースで宣言されています(実際に特定のオブザーバーを削除したかどうかを示すbooleanも返しません)。私はこれが意図的に行われていると確信しています(情報が隠れています;すべてのリスナーの 'Set'を得ることができれば、それらを削除することもできます...)。おそらくあなたはラッキーです。プロパティクラスは 'XYZPropertyBase'を拡張し、リスナーを使ってリスナーへのアクセスを強制することができますが、この方法ではAPIが行うべきことではないことをしています... – fabian

答えて

0

リスナリストに直接アクセスすることはできませんが、デバッガ(私は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(); 
    } 

、あなたがあなたのケースに収まるようにする方法を知っているよ結果::)十分に明確 enter image description here

別の方法がある enter image description here

(お知らせジ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); 

結果:enter image description here

私は警告を受けるが、仕事は終わった!

+0

long Java 9リリースそのジグソーパズルがjavafxの内部に問題になるようにアクセスしました – ayvango

+0

field = value.getClass()。getDeclaredField( "listener"); 私はそれをインポートすることはできませんが、私はそれをオブジェクトを取得した後getClassを使用することができます(私はこのコードでJava 9を使用します) –

+0

ObservableValuesを追加するために私の答えを編集しました。 ObservableValueインターフェイスで直接動作することができますが、必要に応じて値を追加することができます... –

関連する問題