在 JavaFX 中实现只读样式?

Implement read-only style in JavaFX?

我想要具有不同状态的实体(控件或 属性),可以用 CSS 着色。

例如,对于TextField,它可以包含两种类型的值,正常值和错误值。一旦包含错误值,应该显示"red"。但实际颜色应该可以从 CSS.

定义

这可以实现吗?

我发现了很多 Styleable* 接口或 类,但它们看起来能够接受任何样式。

我可以编写和实体,它从值派生出它的样式吗?

在特定 属性 的更改事件中,您可以更改该实体(控件或 属性)的样式 class 以应用多种颜色。
为此,您需要在 CSS 中添加多种颜色样式 然后您可以使用以下代码更改样式 Class。

 textfield.getStyleClass().add("red");  

例如,在 TextField 的动作事件上,您可以检查用户在 TextField 中输入了哪个值,如果输入的值为 "erroneous",则获取文本字段的对象并设置样式 class使用上面的代码为其命名。

您可以使用 Node.pseudoClassStateChanged

TextField tf = new TextField();
final PseudoClass shortText = PseudoClass.getPseudoClass("short");
final PseudoClass longText = PseudoClass.getPseudoClass("long");
tf.textProperty().addListener((observable, oldValue, newValue) -> {
    tf.pseudoClassStateChanged(shortText, false);
    tf.pseudoClassStateChanged(longText, false);
    if (newValue!=null && !newValue.isEmpty()) {
        if (newValue.length() < 5) {
            tf.pseudoClassStateChanged(shortText, true);
        } else {
            tf.pseudoClassStateChanged(longText, true);
        }
    }
});

像这样 css:

.text-field:short {
 -fx-background-color: #ffaaaa;
}
.text-field:long {
 -fx-background-color: #aaffaa;
}

尽管老实说,我并不完全确定样式 Class 与伪 Class.

的优缺点是什么