2017-03-31 4 views
0

私はラップJavaFXのコントロールは、ラッパーオブジェクトの配列を持っていますCheckBoxまたはSpinnerを使用します。私は必要な情報を抽出しようとしましたが、この問題は配列にスピナーしかない場合にのみ機能するということです。オブジェクトの配列上のリスナーを設定

私のコードの一部:

ObservableList<WrapperClass> WrapperObjectList = FXCollections.observableArrayList(
    new Callback<WrapperClass, Observable[]>() { 
      @Override 
      public Observable[] call(WrapperClass param) { 
       return new Observable[] { 
        ((Spinner) param.getControl()).valueProperty() 
       }; 
      } 
    } 
); 

WrapperClass.java

private Item item; 
private Control control; 

public WrapperClass(Item item, Control control) { 
    this.item = item; 
    this.control = control; 
} 
+0

「NumberField」とは何ですか? 'call()'メソッドで単に 'instanceof'チェックを行うことはできませんか? –

+0

@James_DはSpinnerの拡張版でした。私はそれに応じて変更しました。 – user3552551

答えて

2

かなりナイーブが、簡単な解決策はただラップノードの種類をテストするために、次のようになります。

ObservableList<WrapperClass> WrapperObjectList = FXCollections.observableArrayList(
    new Callback<WrapperClass, Observable[]>() { 
      @Override 
      public Observable[] call(WrapperClass param) { 
       if (param.getControl() instanceof Spinner) { 
        return new Observable[] { 
         ((Spinner) param.getControl()).valueProperty() 
        }; 
       } else if (param.getControl() instanceof CheckBox) { 
        return new Observable[] { 
         ((CheckBox) param.getControl()).selectedProperty() 
        }; 
       } else return new Observable[0] ; 
      } 
    } 
); 

より洗練されたアプローチは、適切なプロパティはWrapperClassです。あなたはWrapperClass抽象作ることができます:

public abstract class WrapperClass { 

    private Item item; 
    private Control control; 

    public WrapperClass(Item item, Control control) { 
     this.item = item; 
     this.control = control; 
    } 

    public abstract Observable observableValue() ; 

} 

をして、具象サブクラスを作成:CheckBoxSpinnerため

public class SpinnerWrapper extends WrapperClass { 

    private final Spinner spinner ; 

    public SpinnerWrapper(Item item, Spinner spinner) { 
     super(item, spinner); 
     this.spinner = spinner ; 
    } 

    @Override 
    public Observable observableValue() { 
     return spinner.valueProperty(); 
    } 
} 

と同様に。次に、あなただけの代わりに、あなたはWrapperClassは、一般的な作り、あなたが必要なプロパティを返すことに関数を供給することができ

ObservableList<WrapperClass> WrapperObjectList = FXCollections.observableArrayList(
    new Callback<WrapperClass, Observable[]>() { 
      @Override 
      public Observable[] call(WrapperClass param) { 
       return new Observable[] { 
        param.observableValue() 
       }; 
      } 
    } 
); 

が必要:

あなたが

WrapperClass<Spinner> spinnerWrapper = new WrapperClass(someItem, someSpinner, 
    Spinner::valueProperty); 
WrapperClass<CheckBox> checkBoxWrapper = new WrapperClass(someOtherItem, someCheckBox, 
    CheckBox::selectedProperty); 

としてインスタンス化します

public class WrapperClass<C extends Control> { 

    private Item item ; 
    private C control ; 

    private Function<C, Observable> valueFunction ; 

    public WrapperClass(Item item, C control, Function<C, Observable> valueFunction) { 
     this.item = item ; 
     this.control = control ; 
     this.valueFunction = valueFunction ; 
    } 

    public Observable observableValue() { 
     return valueFunction.apply(control); 
    } 
} 

観測可能なリストは、上記のようにparam.observableValue()を返すだけのエクストラクタで作成されます。

+0

ありがとうございます。出来た! – user3552551

関連する問題