JavaFX - 数据绑定 - 添加一个附加的BooleanBinding

时间:2016-11-24 09:25:47

标签: java javafx data-binding boolean-logic

假设我有一个visibleProperty()的Control,它绑定到应用程序某处的BooleanProperty

我想要实现的是在另一段代码中添加一个额外的绑定,以确保可见性是例如总是假的,无论是现有的还是即将发生的绑定。但是,如果存在返回false的绑定,则永远不可能将visiblity设置为true。所以我需要实现一种布尔逻辑。

第一次尝试是使用OR / AND-concatinations。

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,Marry

1 个答案:

答案 0 :(得分:2)

在这种情况下,您只需添加一个附加绑定到visibleProperty

示例:

第一个visibleProperty的{​​{1}}绑定到Button的{​​{1}},因此当您按下切换按钮时,该按钮可见或不可见。

如果按下第三个按钮,则新的绑定会添加到第一个selectedProperty的{​​{1}},ToggleButton始终保持visibleProperty。从这一刻起Button无效。

false

重要说明:如果切换绑定的顺序(首先是false,然后是ToggleButton的绑定),结果会有所不同。在这种情况下,可见性将根据切换的选定状态而改变(您可以认为是第二个"覆盖"第一个)。

注意#2:在您执行此操作的示例中:

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,但不要将其分配到任何地方,因此它对a.and(Bindings.createBooleanBinding(() -> false)); System.out.println(a.getValue()); 没有影响。

您可以更新它以将结果视为:

BooleanBinding

注意#3:如果您尝试按照示例

创建绑定
a

最有可能产生BooleanBinding andBinding = a.and(Bindings.createBooleanBinding(() -> false)); System.out.println(andBinding.getValue());