我是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内容不与图像重叠。
答案 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
的高度或填充已更改,则使用此绑定,将重新评估绑定。