【问题标题】:JavaFX - Databinding - Add an addition BooleanBindingJavaFX - 数据绑定 - 添加一个额外的 BooleanBinding
【发布时间】:2016-11-24 09:25:47
【问题描述】:

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

我想要实现的是在另一段代码中添加一个额外的绑定,以确保可见性是例如总是假的,不管它现有的或即将到来的绑定。但是,如果存在返回 false 的绑定,则永远不可能将可见性设置为 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());    
}

也许你们中的某个人有一个更有创意的想法。

谢谢,结婚

【问题讨论】:

  • 这个问题真的没有意义。 a.bind(b) 表示a 将始终具有与b 相同的值。听起来您正在尝试执行一些更改 bind 含义的代码:根本没有办法做到这一点。如果您希望 a 的值依赖于一些更复杂的表达式,您只需绑定到更复杂的表达式,例如a.bind(b.and(Bindings.createBooleanBinding(() -> false)));

标签: java javafx data-binding boolean-logic


【解决方案1】:

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

示例:

第一个ButtonvisibleProperty 绑定到ToggleButtonselectedProperty,因此当您按下切换按钮时,按钮可见或不可见。

如果按下第三个按钮,则会将新的绑定添加到第一个 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));

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

注意#2:在你的例子中,当你这样做时:

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

在第一行,您正在创建一个新的BooleanBinding,但您没有将它分配给任何地方,因此它对a 没有影响。

您可以更新它以查看结果:

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

注意事项 #3:如果您尝试像示例中那样创建绑定

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

它很可能会导致StackOverflowError

【讨论】:

  • 谢谢。但这不是我要找的,因为不能保证这个 visibleProperty 不会有其他传入绑定。因此,如果有第四个切换按钮,将可见性设置为 true,则“永远不可见”-按钮将不再有效。就像我说的,我必须将绑定连接到所有现有的和传入的绑定
  • 很奇怪的用例。附加绑定的可能来源是什么?通常 GUI 控件是不公开的,因此您是唯一可以直接控制它们的人。所以我不太了解背后的恐惧。无论如何:我怀疑是否有可能不将确切的Node 子类化或将其包装到可以处理“绑定优先级”的类。
  • @MarryS 一个非常奇怪的想法,但您可以添加一个更改监听器,它始终将可见性设置为 false 并删除除自身之外的所有其他监听器。不知道这是否可行,但也许它可以完成这项工作
  • “很奇怪的用例”...你说得对:/。解释它需要太多的台词,但我现在无能为力。
  • 如果绑定了属性,不能直接设置值。这将导致RuntimeException。在此侦听器中,您必须首先使用unbind 删除所有绑定。但是例如如果您在该属性上有另一个侦听器,该侦听器始终将该属性设置为 true,那么您将再次接近 StackOverflowError^^。所以:这不是那么简单,这就是我提到子类化和包装的原因。另一件事:您也可以使用新的伪类从 CSS 中隐藏节点(它也可以明显被覆盖)但是,如果您担心外部绑定,它也可以是一个解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 2013-01-15
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多