使用CSS

时间:2016-07-25 16:03:56

标签: css javafx combobox

我正在努力让我的不可编辑的Combobox有一个提示文字,填充文字颜色比实际的文字填充颜色轻一些(就像文字输入一样)。

我越过了这个主题,解释了通过覆盖按钮单元格的解决方案:JavaFX 8 - How to change the color of the prompt text of a NOT editable combobox via CSS?

我的问题很简单:我们可以通过CSS文件实现本文所述的机制吗?我觉得这是不可能的,但由于我在CSS中根本不是专家,我想知道我是否可能错过了一些东西。

1 个答案:

答案 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个包中的一个类,可能会有所变化。