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