JavaFX CSS 中的 -fx-text-fill 和 -fx-text-inner-color 有什么区别?

What's the difference between -fx-text-fill and -fx-text-inner-color in JavaFX CSS?

来自 JavaFX CSS Reference Guide 我对 -fx-text-fill 属性 了解得足够多了。

在处理一个最近更新到 JavaFX 16 的更大的 JavaFX 项目时,我遇到了一些 CSS 代码,这些代码使用 -fx-text-inner-color 显然实现了完全相同的事情,即更改文本(在我的例子中)TextField 控件的颜色。

因为我找不到关于第二个的任何文档属性,所以我决定在这里问一下。

谁能解释一下这两个属性之间的区别,为什么我们可能需要这两个属性,以及什么时候更喜欢一个?

-fx-text-fill 是为具有 text 属性的控件定义的 CSS 属性(例如 Labeled 及其子类,以及 TextInputControl及其子类)。

如问题中所述,属性 列在 JavaFX CSS Reference Guide 中。

-fx-text-inner-color 不是 属性,而是在默认样式表 modena.css. It is used as the value of the -fx-text-fill property for controls which have a background color set to -fx-control-inner-background 中定义的查找颜色(本质上是 CSS 颜色变量),即“文本框、密码框、列表、树和表格”。

在根级别更改 -fx-text-inner-color 会影响所有文本框、密码框、列表、树和表格的文本颜色。

请注意,-fx-text-inner-color的默认值设置为色阶,这取决于-fx-control-inner-background的值。即,当 -fx-control-inner-background 较暗(小于 45% 强度)时,设置为 -fx-light-text-color,当较亮(大于 60% 强度,默认为)时,设置为-fx-mid-text-color,否则设置为-fx-dark-text-color。它们的默认值分别是 white#333black

这些默认设置的效果是获得始终与背景形成对比的文本填充;因此,如果您更改 -fx-control-inner-background 的值,文本颜色将自动调整。

实际上有两种不同的方法来定义应用程序的生产级样式:

  • 为您在应用程序中使用的所有控件定义样式。在这种方法中,您将在每个控件上设置 properties(或者至少设置与默认值不同的属性)。这是更多的工作,但创建了一个“独立”样式,如果用户有一个带有新默认样式表的 JavaFX 实现,它在未来更有可能是健壮的。

  • 点击默认样式表 modena.css 并更改 查找颜色 的值,所有内容都基于此。这要容易得多。只需更改 -fx-base 的值,您就可以走很长一段路,大多数其他查找的颜色都是从该值定义的。其他关键查找颜色是

    • -fx-background,用于windows和窗格
    • 的背景色
    • -fx-control-inner-background,用于文本框、列表、表格和树的背景色
    • -fx-dark-text-color-fx-mid-text-color-fx-light-text-color,用于定义在 -fx-background-fx-control-inner-background
    • 上绘制的文本的颜色阶梯
    • -fx-accent(选择)、-fx-default-button-fx-focus-color-fx-faint-focus-color

    尝试创建一个应用程序并使用

     .root { -fx-base: black; }
    

    作为样式表,没有任何其他样式设置。您应该会看到一个非常有效的“深色主题”。您可能想要更改一些其他颜色,尤其是选择和焦点颜色,但仅此更改就可以很好地工作。

    请注意,如果您使用更改查找颜色的方法,而不是单独为所有控件设置属性,则您对新的默认样式表不可靠。您可以通过将您的用户代理样式表显式设置为 MODENA:

    来使其健壮
     Application.setUserAgentStylesheet(Application.STYLESHEET_MODENA);