我想要具有不同状态的实体(控件或属性),可以通过CSS对其进行着色。
例如,以TextField为例,它可以包含两种值,正常值和错误值。一旦包含错误值,则应显示为“红色”。但是实际颜色应该可以从CSS定义。
这可能实现吗?
我发现了很多Styleable*接口或类,但是它们看起来可以接受任何样式。
Styleable*
我可以编写和实体,从价值中衍生出风格吗?
您可以使用Node.pseudoClassStateChanged:
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 vs. Pseudo Class的优缺点。