JavaFX DataBinding表现得很奇怪

时间:2016-03-09 07:57:23

标签: java data-binding javafx

我有一个填充结果列表的工人。 ListView绑定到此结果列表,并在可用时立即填充部分结果。效果很棒!

然后有一个按钮可以处理列表中的项目。因此,只要列表为空,就应该禁用它。这适用于其他所有列表。但不适合这个。

我通过剥离UI组件并仅使用属性来减少了示例。结果是一样的。要么存在某种错误,要么我不明白绑定是如何工作的。

我希望对此有任何帮助评论。

只需将此代码放入main()方法中即可看到问题。我使用的是Java 1.8 Update 74。

    def method():
        string = """\
line one
line two
line three\
"""

1 个答案:

答案 0 :(得分:0)

绑定是针对items进行的,仅适用于items。这意味着只有在替换列表时才会更新值,但如果只修改它则不会更新。

要通知items包含的列表中的更改,每次更换列表时都需要将属性绑定到列表的“空白条件”:

items.addListener((observable, oldValue, newValue)-> {
    if (newValue == null) {
         disabled.unbind();
         disabled.set(true);
    } else {
         disabled.bind(Bindings.isEmpty(newValue));
    }
});

或更简单 - 使用ListProperty

ListProperty<String> items = new SimpleListProperty<>();
disabled.bind(Bindings.isEmpty(items));

Bindings.createXYZBinding(callable, o1, 02, ..., oN)创建一个XYZBinding,用于缓存callable在评估时返回的值。评估是懒惰的,即当绑定很脏时:

    在绑定对象或上调用
  1. get
  2. 将第一个侦听器添加到绑定或
  3. 至少添加了一个 ChangeListener ,且绑定变脏了
  4. 绑定很脏,如果

    1. 尚未评估该值(初始状态)
    2. 在创建绑定时添加到o1,...,oN的其中一个侦听器收到更改事件。
    3. 如果评估callback,绑定会再次变得干净(即不脏)。

      绑定缓存callback评估的结果,并在调用get或需要将数据传递给ChangeListener时使用此结果。只有在评估后,才会调用监听器,缓存的值会发生变化。