2016-07-25 50 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