2016-04-27 1 views
0

Я хотел бы иметь объект (элемент управления или свойство), который имеет разные состояния, которые могут быть окрашены CSS.Использовать стиль только для чтения в JavaFX?

Например, обратите внимание на TextField, который может содержать два типа значений, нормальный и ошибочный. Когда он содержит ошибочное значение, он должен быть отображен «красным». Но фактический цвет должен быть определен из CSS.

Можно ли это реализовать?

Я нашел много интерфейсов или классов Styleable*, но они выглядят как способные принять любой стиль.

Могу ли я написать и сущность, которая выводит ее стиль из значения?

ответ

3

Вы можете использовать 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; 
} 

Хотя, если честно, я не совсем уверен, что плюсы и минусы Стиль класса vs. Псевдокласс.

+1

'PseudoClass' намного проще управлять булевым состоянием, так как оно либо установлено, либо не установлено. Регулярные классы CSS хранятся как 'Список'' String ', связанных с каждым узлом. Поскольку это «Список», он может содержать дубликаты. Поэтому, когда вы можете добавлять и удалять классы стилей из этого списка, вы должны быть осторожны, чтобы не добавлять несколько копий данного класса стилей (если это действительно так, как вы хотите, по какой-то причине). Следовательно, для подобных случаев использование «PseudoClass» имеет тенденцию приводить к созданию более чистого кода. –

+0

Спасибо за объяснение! Существует ли определенное поведение, когда класс стиля присутствует несколько раз для узла (либо для JavaFX, либо для простого CSS)? Я не уверен, что могу думать о разумном поведении, рассматривая его как появление только один раз. – Itai

+0

Правила сопоставления CSS просто смотрят, есть ли класс стиля на узле или нет. Поэтому, если он добавлен несколько раз в список, он соответствует классу. Проблемы могут возникнуть, если вы попытаетесь удалить его: 'myNode.getStyleClass(). Remove (" some-style ");' удаляет первое вхождение, поэтому, если вы случайно добавили его несколько раз, это (возможно) выиграло «У вас есть тот эффект, который вы ищете ... Это может быть очень сложно, например в реализациях пользовательских ячеек, где вы не имеете большого контроля над вызовом 'updateItem()'. –

0

При изменении события определенного свойства вы можете изменить класс стиля этого объекта (элемент управления или свойство), чтобы применить несколько цветов.
Для этого вам нужно добавить несколько стилей цвета в CSS , а затем вы можете изменить класс стиля, используя приведенный ниже код.

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

Например, на событии действия в TextField, вы можете проверить, какие значения пользователя вошел в TextField и если введенное значение «ошибочное», то получить объект текстового поля и задайте имя класса стиля к нему с помощью выше кода.