かなりナイーブが、簡単な解決策はただラップノードの種類をテストするために、次のようになります。
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()
を返すだけのエクストラクタで作成されます。
「NumberField」とは何ですか? 'call()'メソッドで単に 'instanceof'チェックを行うことはできませんか? –
@James_DはSpinnerの拡張版でした。私はそれに応じて変更しました。 – user3552551