标记为TextArea的直接子项未显示

时间:2018-06-18 04:39:42

标签: java javafx javafx-8

首先,我是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);
}

0 个答案:

没有答案