JavaFX 中 TextFields 内部的组件是什么?

What is the component inside TextFields in JavaFX?

提问人:George Economou 提问时间:11/15/2023 最后编辑:TylerHGeorge Economou 更新时间:11/16/2023 访问量:52

问:

我在 JavaFX 中有一个应用程序,其中包含通用窗格和文本字段。我希望 Panes 有一个可见的边框,并且由于此应用程序中所有内容的背景都是黑色的,因此我只需要更改我想要实际看到的任何边框的颜色。为此,在我的样式表中,我继续声明:

Pane {
    -fx-background-color: black;
    -fx-border-color: red;
}

在下图中,红色表示效果。

现在,问题是这扰乱了我的 TextFields。我已将 TextField 的边框颜色更改为绿色,以便它们与窗格边框形成鲜明对比。结果是这样的:

.text-field {
    -fx-background-color: black;
    -fx-border-color: green;
}

还有其他垃圾,但这是相关的东西。

There are panes in my textfields.

从图像中,您可以看到问题所在。文本字段内部有窗格,因此通过将窗格的边框设置为红色,我会得到文本字段中文本的轮廓,而我不希望在那里。但是,参考指南或源代码似乎没有演示文本字段具有任何类似的内部组件,因此由于我不知道它在 .text-field 中是什么特定类型的窗格,因此我无法向我的样式表添加规则以使其消失。我该如何摆脱这个东西?

java css javafx

评论

1赞 jewelsea 11/15/2023
如果您想了解场景图的结构,请使用 ScenicView

答:

4赞 Slaw 11/15/2023 #1

当你有这个时:

Pane {
    /* ... */
}

然后,您正在使用“类型选择器”。任何类型选择器等于的节点都将是此 CSS 的目标。在实践中,这意味着样式表所覆盖的场景图部分的所有实例(但不包括子类型)。这可能是不可取的。"Pane"Pane

我建议你使用类选择器:

.some-pane-class {
    /* ... */
}

或者 ID 选择器:

#somePaneId {
    /* ... */
}

这将涉及向节点添加样式类(如果节点还没有所需的样式类)和/或设置节点的 ID。有关更多信息,请参阅《JavaFX CSS 参考指南》。

综上所述,无论是 JavaFX 的 Javadoc 还是 CSS 参考指南,都没有记录每个控件的整个结构。这些结构中有相当一部分是实现细节。其中许多未记录的节点没有样式类或 ID。这通常是可以的,因为你很少会想直接在样式表中定位这些未知节点。但是,如果您想了解场景图的结构,包括未记录的部分,那么有两个工具可以帮助您。

  1. 场景生成器CSS 分析器视图。

  2. 尤其是风景优美

此外,您还可以研究 JavaFX 源代码

对于默认外观 ,有一个“文本组”窗格用于对文本、插入符号和选择矩形进行分组(至少在 JavaFX 21 中是这样)。这很可能是您在问题中看到的样式。使用类选择器或 ID 选择器(而不是类型选择器)将解决该问题。TextFieldPane