A Skin
可以从CSS分配。您可以对Skin
的构造函数应用对Skinnable
的修改,这不是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',则可以在'-fx-skin' CSS属性中使用它而无需以其他方式将其与'ComboBox'连接起来,这将导致'prompt'伪类被添加/删除,从而允许在CSS选择器中使用它。我已经检查过这个单元格的类和伪类是不同的,并且初始时伪类不同(不是':odd' /':even',但是在选择了某些东西并清除了选择之后,这不起作用) – fabian