2016-11-24 10 views
1

コントロールのvisibleProperty()がアプリケーションのどこかにBooleanPropertyにバインドされているとします。JavaFX - データバインディング - 追加BooleanBinding

私が達成したかったのは、視認性が保証されているかどうかを確認するために、コードの一部分に追加のバインディングを追加することでした。既存または今後のバインディングに関係なく常に偽です。ただし、falseを返すバインディングがある場合は、visiblityをtrueに設定することはできません。だから私はブール論理の一種を実装する必要があります。

最初の試みは、OR/AND連鎖を使用することでした。

tableColumn.visibleProperty().and(Bindings.createBooleanBinding(() -> false)); 

しかし、次の例のように、これはうまくいかない可能性があります。

public static void main(String[] args) { 
    BooleanProperty a = new SimpleBooleanProperty(false); 
    BooleanProperty b = new SimpleBooleanProperty(true); 
    a.bind(b); 
    System.out.println(a.get()); 
    a.and(Bindings.createBooleanBinding(() -> false)); 
    System.out.println(a.getValue());  
} 

多分あなたの誰かがより創造的なアイデアを持っています。

Thxを、あなたは、単にvisiblePropertyに結合additinalを追加することができます。この場合、

+0

質問は本当に意味をなさない。 'a.bind(b)'は 'a'が常に' b'と同じ値を持つことを意味します。'bind'が意味するものを変更するコードを実行しようとしているように聞こえます。単にそれを行う方法はありません。 'a'の値をより複雑な式に依存させたい場合は、もっと複雑な式にバインドするだけです。 'a.bind(b.and(Bindings.createBooleanBinding(() - > false)))); ' –

答えて

2

と結婚。

例:最初のButton

visiblePropertyToggleButtonselectedPropertyにバインドされ、したがって、あなたがトグルを押すと、ボタンが表示またはunvisibleです。

3つ目のボタンを押すと、新しいバインディングが最初のButtonvisiblePropertyに追加され、常にfalseのままです。この瞬間からToggleButtonは効果がありません。

BorderPane root = new BorderPane(); 

Button b = new Button("Button"); 
ToggleButton tb = new ToggleButton("Make Button invisible"); 

b.visibleProperty().bind(tb.selectedProperty().not()); 

Button overrideBinding = new Button("Make Button invisible forever"); 
overrideBinding.setOnAction(e -> b.visibleProperty().bind(new SimpleBooleanProperty(false))); 

root.setCenter(new VBox(b, tb, overrideBinding)); 

重要な注意:あなたは(ToggleButtonとの結合後、最初に偽)バインディングの順序を切り替えた場合、結果は異なります。この場合、選択したトグルの状態に基づいて可視性が変化します(最初のものを上書きすると考えることができます)。

注意#2:あなたは、このやっているあなたの例では:あなたは新しいBooleanBinding作成している最初の行に

a.and(Bindings.createBooleanBinding(() -> false)); 
System.out.println(a.getValue());  

をしかし、あなたはそれゆえ、それは効果がありません、どこかにそれを割り当てませんaにあります。

あなたはその結果を見て、それを更新することができます:あなたはあなたの例のように結合

a.bind(a.and(Bindings.createBooleanBinding(() -> false))); 

を作成しようとする場合、それはおそらくなります:

BooleanBinding andBinding = a.and(Bindings.createBooleanBinding(() -> false)); 
System.out.println(andBinding.getValue()); 

ノート#3 StackOverflowErrorにあります。

+0

ありがとうございました。しかし、これは私が探しているものではありません。なぜなら、このvisiblePropertyには他の着信バインディングが存在しないことが保証されていないからです。したがって、可視性をtrueに設定する第4のトグルボタンがある場合、「永遠に見えないようにする」ボタンはもはや効果を持ちません。私が言ったように、バインディングをすべての既存の着信バインディングに連結する必要があります – MarryS

+1

かなり奇妙なusecase。追加バインディングの可能なソースは何ですか?通常、GUIコントロールは公開されていないので、あなたはそれらを直接コントロールする唯一のユーザーです。だから私は本当の背後にある恐れを理解していない。いずれにせよ、正確な 'Node'をサブクラス化せずに、あるいはそれをクラスにラップすることなく、"バインディング優先度 "を扱うことが可能であるかどうかは疑問です。 – DVarga

+0

@MarrySかなり奇妙な考えですが、常に可視性をfalseに設定し、他のすべてのリスナーを削除するchangelistenerを追加できます。これがうまくいくかどうかわからないが、多分それは仕事をする – Clayn

関連する問題