属性选择器如何在 JavaFX 中工作?

How do Attribute Selectors work in JavaFX?

JavaFX CSS Reference Guide中明确指出

JavaFX Cascading Style Sheets (CSS) is based on the W3C CSS version 2.1 [1] with some additions from current work on version 3 [2].

在 JCRG 中,他们经常 link 直接参考 W3C 的 CSS 参考指南,他们谈论选择器时也是如此。

在 JCRG 中,他们提到 Type Selectors, Class Selectors, and ID Selectors—they even go so far as to say that they don't support structural pseudo-classes—but nothing is said about Attribute Selectors

如果 JavaFX 支持它们,它们是如何工作的? JavaFX 将什么视为属性?我认为 CSS 引擎可能会查看 FXML 中的属性,但并非所有场景图都源自 FXML。

FXML 属性只是设置相应对象的属性。本身没有 "property selectors",但是当且仅当某些属性被设置时,一些节点才会设置伪类(这些在参考指南中有记载 link)。所以最重要的是,没有属性选择器的直接等价物,除非它们直接映射到伪类。

请注意,当然,如果您需要支持基于 属性 的 CSS,您始终可以观察到 属性 和 set/unset 自定义伪类。所以总是可以将属性选择器重铸为伪类。

所以,例如假设您想为具有 "alignment=CENTER_RIGHT" 属性的文本字段设置不同的样式。你可以做

TextField textField = new TextField();
PseudoClass rightAligned = PseudoClass.getPseudoClass("right-aligned");
textField.alignmentProperty().addListener((obs, oldAlignment, newAlignment) -> 
    textField.pseudoClassStateChanged(rightAligned, newAlignment == Pos.CENTER_RIGHT));

那么在你的CSS中你只需要

.text-field:right-aligned {
    /* style rules */
}