Skin
は、CSSから割り当てることができます。 Skin
が行うべきではないSkin
のコンストラクタのSkinnable
に変更を適用することができます。
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());
}
}
皮膚を用いて実施例:Skin
が変更されるかもしれcom.sun
パッケージからクラスを拡張すること
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%);
}
注意。
うわー、単純なテキストを少し軽くするのはかなり変わったのです!/ – Xendar
@Xendar: 'Skin'がクラスパスで利用可能な場合は、単に' -fx-skin' CSSプロパティーで使用することができます他の方法でこれを 'ComboBox'と接続せずに、' prompt'疑似クラスが追加/削除され、CSSセレクタでそれを使うことができます。私は、クラスと擬似クラスのセルが異なっていて、最初に疑似クラス化された相違点があるかどうかをチェックしました( ':odd' /':even'ではなく、 – fabian