2016-07-25 198 views
0

我试图让我的不可编辑的组合框具有填充文本颜色比实际文本填充颜色(对于文本输入)轻一点的提示文本。Javafx不可编辑Combobox提示文本样式与CSS

我越过这个话题,说明了解决方案经历的扣式电池的倍率:JavaFX 8 - How to change the color of the prompt text of a NOT editable combobox via CSS?

我的问题很简单:我们可以实现在这篇文章中,而是通过一个CSS文件中描述的机制?我觉得这是不可能的,但是因为我在CSS中并不擅长,所以我不知道我是否可能错过了一些东西。

回答

1

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%); 
} 

注意,Skincom.sun软件包,其可以有所变化,延伸的类。

+0

哇,这是一个简单的文字变得更轻的变化! 因此,到目前为止,仅仅通过改变一些CSS类来解决问题,太糟糕了:/ – Xendar

+0

@Xendar:请注意,如果在类路径中可以使用'Skin',则可以在'-fx-skin' CSS属性中使用它而无需以其他方式将其与'ComboBox'连接起来,这将导致'prompt'伪类被添加/删除,从而允许在CSS选择器中使用它。我已经检查过这个单元格的类和伪类是不同的,并且初始时伪类不同(不是':odd' /':even',但是在选择了某些东西并清除了选择之后,这不起作用) – fabian