在JavaFX中实现只读样式?

我希望实体(控件或属性)具有不同的状态,可以通过CSS着色。

例如,考虑TextField,它可以包含两种值,正常和错误。 一旦它包含错误值,它应显示为“红色”。 但实际的颜色应该可以从CSS定义。

这有可能实现吗?

我找到了很多Styleable*接口或类,但它们看起来能够接受任何风格。

我可以写和实体,从价值中衍生出它的风格吗?

您可以使用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; } 

虽然老实说我不完全确定Style Class与Pseudo Class的优点和缺点是什么。

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

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

例如,在TextField的动作事件中,您可以检查用户在TextField中输入的值,如果输入的值是“错误的”,则获取文本字段的对象,并使用上面的代码将样式类名称设置为它。