A Skin
можно назначить из CSS. Вы можете применить модификации к Skinnable
в конструкторе Skin
, что не должно быть сделано Skin
.
Назначение PseudoClass
всякий раз, когда не выбран ни один элемент, это может быть что-то, что может сделать Skin
.
С таким псевдоклассом buttonCell
может быть создан из CSS.
package combobox.promptstyle;
import com.sun.javafx.scene.control.skin.ComboBoxListViewSkin;
import javafx.beans.value.ChangeListener;
import javafx.css.PseudoClass;
import javafx.scene.control.ComboBox;
import javafx.scene.control.SelectionModel;
// extend default ComboBox Skin
public class PromptSkin<T> extends ComboBoxListViewSkin<T> {
private static final PseudoClass PROMPT = PseudoClass.getPseudoClass("prompt");
public PromptSkin(final ComboBox<T> comboBox) {
super(comboBox);
ChangeListener<Number> selectionIndexChangeListener = (observable, oldIndex, newIndex) -> {
getNode().pseudoClassStateChanged(PROMPT, newIndex.intValue() < 0);
};
ChangeListener<SelectionModel> modelChangeListener = (observable, oldSelectionModel, newSelectionModel) -> {
if (oldSelectionModel != null) {
oldSelectionModel.selectedIndexProperty().removeListener(selectionIndexChangeListener);
}
if (newSelectionModel != null) {
newSelectionModel.selectedIndexProperty().addListener(selectionIndexChangeListener);
selectionIndexChangeListener.changed(null, null, newSelectionModel.getSelectedIndex());
} else {
selectionIndexChangeListener.changed(null, null, -1);
}
};
comboBox.selectionModelProperty().addListener(modelChangeListener);
modelChangeListener.changed(null, null, comboBox.getSelectionModel());
}
}
Пример использования кожи:
ComboBox comboBox = ...
comboBox.setId("combo");
// set stylesheet
CSS стилей
#combo {
/* set skin to use */
-fx-skin: 'combobox.promptstyle.PromptSkin';
}
#combo:prompt > .list-cell {
-fx-text-fill: derive(-fx-control-inner-background,-30%);
}
Обратите внимание, что Skin
расширяет класс от com.sun
пакетов, которые могут быть подвержены изменениям.
Ничего себе, это довольно изменение, чтобы получить простой текст немного легче! Итак, до сих пор нет решения, только меняя некоторые классы CSS, слишком плохо:/ – Xendar
@Xendar: Обратите внимание, что если 'Skin' доступен в пути к классам, вы можете просто использовать его в свойстве CSS -fx-skin' без необходимости связать это с «ComboBox» каким-либо другим способом, что приведет к добавлению/удалению псевдокласса 'prompt', который позволяет использовать его в селекторе CSS. Я проверил, были ли классы и псевдоклассы для ячейки разными и псевдоклассифицированы по-разному (нет ': odd' /': even', но после выбора чего-то и очистки выбора это не сработает) – fabian