小编典典

在JavaFX中实现只读样式?

java

我想要具有不同状态的实体(控件或属性),可以通过CSS对其进行着色。

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

这可能实现吗?

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

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


阅读 379

收藏
2020-11-30

共1个答案

小编典典

您可以使用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的优缺点。

2020-11-30