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

问题描述

JavaFX CSS Reference Guide 开始,我对 -fx-text-fill 属性有足够的了解以使用它。

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

由于我找不到关于第二个属性的任何文档,我决定在这里询问。

有人能解释一下这两个属性间的区别吗?为什么我们需要这两个属性,以及何时选择一个而不是另一个

解决方法

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

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

-fx-text-inner-color 不是属性,而是在默认样式表 modena.css 中定义的查找颜色(本质上是 CSS 颜色变量)。它用作背景颜色设置为 -fx-control-inner-background 的控件的 -fx-text-fill 属性值,即“文本框、密码框、列表、树和表格”。

在根级别更改 -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 的值,文本颜色将自动调整。

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

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

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

    • -fx-background,用于窗口和窗格的背景色
    • -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);