JavaFX:绑定到insets

时间:2016-11-28 07:31:14

标签: java user-interface javafx data-binding javafx-bindings

我是JavaFX的新手,并且对绑定功能非常着迷。但是,我无法弄清楚如何绑定到节点的边距/填充。

目前,我正在尝试创建一个左侧有图像的文本框(或TextField)。我创建了一个StackPane来包装TextField,以及一个ImageView到StackPane。然后我尝试将ImageView的height属性绑定到TextField的height属性,但是在TextField中,图像在视觉上看起来不像它,因为它与TextField的边界重叠

我最终修改了绑定以考虑TextField的填充。

imageView.fitHeightProperty().bind(textField.heightProperty().subtract(textField.getPadding().getTop() + textField.getPadding().getBottom()));

它正在工作,但是paddings没有绑定的部分让我感到不安,因为这个值被计为一个常量,它相当于我设置绑定时的填充。如果在绑定后再次更改填充,事情就会变得混乱。

这是我想要实现的文本字段的example

有更好的方法吗?要么是一个更好的绑定方法,要么是一个完全不同的方法来制作类似于示例的UI。当前的方法并不优雅,因为我还设置了固定数量的左边距,以便TextField内容不与图像重叠。

1 个答案:

答案 0 :(得分:2)

您可以使用Bindings.createDoubleBinding创建自己的绑定:

imageView.fitHeightProperty().bind(Bindings.createDoubleBinding(() -> 
    textField.getHeight() - (textField.getPadding().getTop() + textField.getPadding().getBottom())
, textField.paddingProperty(), textField.heightProperty()));

如果检查方法签名:

public static DoubleBinding createDoubleBinding(Callable<Double> func, Observable... dependencies)

DoubleBinding的javadoc:

  

如果其中一个注册的依赖项变为无效,则为此   DoubleBinding被标记为无效。

如果TextField的高度或填充已更改,则使用此绑定

,将重新评估绑定。