2017-08-11 3 views
3

JavaFXにはgreaterThanlessThanなどのメソッドを継承し、BooleanBindingを返すIntegerPropertyクラスがあります。ただし、値がint(したがって、別のIntegerPropertyクラス)として格納されるため、null値は許可されません。JavaFX:null値を許可し、greaterThanやlessThanのようなメソッドを提供する整数プロパティがありますか?

逆に、ObjectProperty<Integer>はnull値を許可しますが、そのようなメソッドは提供しません。 (恐らく例えば、Comparatorを使用)は、2つの特性を比較可能ヌル値できる一方BooleanBinding(または類似の)を得る

これらの両方を有するの方法はありますか?

答えて

2

静的メソッドIntegerProperty.integerProperty(Property<Integer>)Property<Integer>からIntegerPropertyを作成し、それらの間に双方向バインディングを確立します。この場合、Property<Integer>のヌル値の扱い方は1つだけです。ゼロとして扱われます。

それはあなたのユースケースのために働く場合は、単に行うことができます。

Property<Integer> age = new SimpleObjectProperty<>(); 
BooleanBinding canVote = IntegerProperty.integerProperty(age).greaterThanOrEqualTo(18); 

はそうでない場合は、唯一の標準APIを使用して、あなたは手でバインディングを作成する必要があります。

Property<Integer> age = new SimpleObjectProperty<>(); 
BooleanBinding canVote = Bindings.createBooleanBinding(() -> { 
    if (age.get() == null) { 
     return false ; 
    } else { 
     return age.get().intValue() >= 18 ; 
    } 
}, age); 

他のオプションは、サードパーティのバインディングライブラリを使用する(または書き込む)ことです。例えば、ReactFX(いくつかの結合のAPIを組み込んだJavaFXのための反応性のプログラミングAPI)を使用して、あなたはここで

Property<Integer> age = new SimpleObjectProperty<>(); 
Val<Boolean> canVote = Val.map(age, a -> a >= 18); 

canVoteを行うことができVal<Boolean>です(ValObservableValueある)ageがnull含まれている場合は、「空」である それ以外の場合はtrueまたはfalseです。あなたは

ObservableValue<Boolean> canVote = Val.map(age, a -> a >= 18).orElseConst(false); 

agenullが含まれている場合は、値を持つようにそれを強制的に行うことができます。

関連する問題