2016-07-25 7 views
0

編集できないComboboxに、実際のテキストの塗りつぶしの色(テキスト入力の場合)より少し明るいテキストの塗りつぶしを持つようにしようとしています。Javafxが編集できないCSSでコンボボックスプロンプトのテキストスタイル

私はボタン電池のオーバーライドを通過するソリューションを説明し、このトピックを渡っ:JavaFX 8 - How to change the color of the prompt text of a NOT editable combobox via CSS?

私の質問は非常に単純です:私たちは、この記事ではなく、CSSファイルを介して記述メカニズムを実装することはできますか?私はこれが不可能だと感じていますが、私はCSSの専門家ではないので、私は何かを見逃しているかもしれないのだろうかと思います。

答えて

1

Skinは、CSSから割り当てることができます。 Skinが行うべきではないSkinのコンストラクタのSkinnableに変更を適用することができます。

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

} 

皮膚を用いて実施例:Skinが変更されるかもしれcom.sunパッケージからクラスを拡張すること

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

注意。

+0

うわー、単純なテキストを少し軽くするのはかなり変わったのです!/ – Xendar

+0

@Xendar: 'Skin'がクラスパスで利用可能な場合は、単に' -fx-skin' CSSプロパティーで使用することができます他の方法でこれを 'ComboBox'と接続せずに、' prompt'疑似クラスが追加/削除され、CSSセレクタでそれを使うことができます。私は、クラスと擬似クラスのセルが異なっていて、最初に疑似クラス化された相違点があるかどうかをチェックしました( ':odd' /':even'ではなく、 – fabian

関連する問題