首先,我是JavaFX的新手。我正在使用自定义控件(特别是自定义TextArea
)并且我正在尝试实现Material Design Text Field,以便能够实现标准设计,我有向字段本身添加Label
,但不幸的是,它从未出现在我的案例中。标签的文本绑定到textarea的StringProperty
,因此在设置属性时,它不会显示为空(或""
字符串)。这是我到目前为止所做的:
class CustomTextAreaSkin extends TextAreaSkin {
Label label;
CustomTextAreaSkin(CustomTextArea control) {
super(control);
label = new Label();
label.textProperty().bind(control.labelProperty());
getChildren().add(label);
}
@Override
protected void layoutChildren(double x, double y, double w, double h) {
super.layoutChildren(x, y, w, h);
// For testing only, to see if it is laid out in this X and Y position.
label.relocate(0, 0);
}
}
将控件添加到场景图中(但正如我所说,当我运行程序时,标签没有显示):
<CustomTextArea label="Label"/>
此外,我还检查了标签是否真的被添加到textarea:
for (int i = 0, s = getChildren().size(); i < s; i++) {
if (getChildren().get(i) instanceof Label) {
System.out.println(getChildren().get(i));
}
}
但事实证明完全没问题(用标签节点打印出匹配的文字):
Label@7e9a0861[styleClass=label]'Label'
另一方面,CSS只是将textarea的-fx-background-color
和标签的其他兄弟姐妹设置为transparent
。这只是为了确保字段清晰,并且没有其他可能阻止标签出现的节点:
.custom-text-area,
.custom-text-area > .content,
.custom-text-area:focused > .content,
.custom-text-area > .scroll-pane,
.custom-text-area > .scroll-pane > .viewport {
-fx-background-color: transparent;
}
在运行程序时,一切似乎都已完全设置,但甚至没有一个标签外观。这是一种痛苦,因为我能够实现这个简单的TextField
,但由于它们的使用/属性略有不同,我不能继承或复制&amp;粘贴文本字段的代码,以便我必须为textarea重新编写它。
我在这里找不到任何可能的想法?
在我的代码中试图找出TH缺失的几个小时之后,我遗忘的一件事就是resize
Label节点。所以基本上,它是正确添加的,但它不可见的原因是,因为它没有特定的 SIZE (宽度/高度)。
我发誓relocate
对我的自定义TextField
来说已经足够了,我只是写了一个从文本域代码中添加标签的完全相同的方法。无论如何,这是修复:
@Override
protected void layoutChildren(double x, double y, double w, double h) {
super.layoutChildren(x, y, w, h);
// This is the added code:
label.resize(label.prefWidth(-1), label.prefHeight(-1))
label.relocate(0, 0);
}