我正在努力让我的不可编辑的Combobox有一个提示文字,填充文字颜色比实际的文字填充颜色轻一些(就像文字输入一样)。
我越过了这个主题,解释了通过覆盖按钮单元格的解决方案:JavaFX 8 - How to change the color of the prompt text of a NOT editable combobox via CSS?
我的问题很简单:我们可以通过CSS文件实现本文所述的机制吗?我觉得这是不可能的,但由于我在CSS中根本不是专家,我想知道我是否可能错过了一些东西。
答案 0 :(得分:1)
可以从CSS分配Skin
。您可以对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
个包中的一个类,可能会有所变化。