Реализовать стиль только для чтения в JavaFX?
Я хотел бы иметь сущность (элемент управления или свойство), который имеет различные состояния, которые можно раскрасить с помощью CSS.
Например, рассмотрим TextField, который может содержать два вида значений: нормальное и ошибочное. Если оно содержит ошибочное значение, оно должно отображаться "красным". Но фактический цвет должен быть определен из CSS.
Возможно ли это реализовать?
Я нашел много Styleable*
интерфейсы или классы, но они выглядят как способные принять любой стиль.
Могу ли я написать и сущность, которая выводит свой стиль из значения?
2 ответа
Ты можешь использовать 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, и если введенное значение является "ошибочным", то получить объект текстового поля и установить для него имя класса стиля, используя приведенный выше код.