37 CSSによるUIコントロールのスタイル設定
このトピックでは、JavaFXでカスケード・スタイル・シート(CSS)を使用する方法、およびアプリケーションのカスタム外観を作成する方法について説明します。
スタイル・シートには、ユーザー・インタフェース要素の外観を制御するスタイル定義が含まれます。JavaFXアプリケーションでCSSを使用する方法は、HTMLでCSSを使用する方法と似ています。JavaFX CSSは、W3C CSSバージョン2.1の仕様(http://www.w3.org/TR/CSS21/
から入手可能)に基づいていますが、バージョン3の現在の仕様の一部や、特定のJavaFX機能をサポートする拡張機能が追加されています。
JavaFX CSSを使用してUIをスキニングすると、使用されているスタイル・シートを変更するだけで、図37-1に示すUIを図37-2に示すUIに変更できます。
デフォルトのスタイル・シート
JavaFXアプリケーションのデフォルトのスタイル・シートは、JavaFXランタイムJARファイルのjfxrt.jar内にあるmodena.cssです。このスタイル・シートにより、ルート・ノードおよびUIコントロールのスタイルが定義されます。このファイルを参照するには、Java Development Kit (JDK)がインストールされているディレクトリの下にある\jre\lib\ext
ディレクトリに移動します。次のコマンドを使用して、JARファイルからスタイル・シートを抽出します。
jar xf jfxrt.jar com/sun/javafx/scene/control/skin/modena/modena.css
図37-3に、デフォルトのスタイル・シートを使用した場合にサンプルUIがどのように表示されるかを示します。
スタイル・シートの作成
独自のスタイル・シートを1つ以上作成し、デフォルトのスタイル・シート内のスタイルをオーバーライドしたり、独自のスタイルを追加できます。通常、作成したスタイル・シートの拡張子は.css
になり、JavaFXアプリケーションのメイン・クラスと同じディレクトリに配置されます。
スタイル・シートcontrolStyle1.cssにより、図37-1に示すスキニングが適用されます。スタイル・シートcontrolStyle2.cssにより、図37-2に示すスキニングが適用されます。
スタイル・シートは、図37-1に示すScene
オブジェクトに適用されます。この場合、pathは、スタイル・シートの場所を表すディレクトリ構造です。また、stylesheetは、スタイル・シートの名前です。たとえば、図37-2のスタイル・シートのパスと名前は、uicontrolcss/controlStyle2.cssです。
スタイルの定義
スタイル定義は、スタイルの名前(セレクタとも呼ばれます)、およびスタイルのプロパティを設定する一連のルールで構成されます。定義のルールは中カッコ({})で囲まれます。例37-2に、.custom-button
という名前のスタイルの定義を示します。
例37-2 スタイル定義のサンプル
.custom-button { -fx-font: 16px "Serif"; -fx-padding: 10; -fx-background-color: #CCFF99; }
注意:
フォントのサイズは、ポイント(pt)またはピクセル(px)単位で指定できます。解像度は96ドット/インチ(dpi)を前提としているため、1pxは0.75ptになります。
セレクタ
複数のタイプのスタイルを定義できます。スタイルのタイプごとにセレクタに対する独自の表記法があります。
スタイル・クラスはクラス名に対応しています。慣例により、複数の単語で構成されたスタイル・クラス名の場合、単語間にハイフン(-)が使用されます。スタイル・クラス・セレクタの先頭にはドット(.)が付きます。
クラス・セレクタの例:
.button .check-box .scroll-bar
また、ノードのIDを介してノードに関連付けられたスタイルを定義することもできます。IDは、ノードのsetId()
メソッドを使用して設定します。スタイル名は、先頭にハッシュ記号(#)が付いたIDです。たとえば、ID my-button
を持つノードは、スタイル#my-button
を使用してスキニングされます。
IDスタイル・セレクタの例:
#my-button #shaded-hbox
複合セレクタを使用することもできます。一部のクラスには、下位クラスと呼ばれる独自のスタイル定義を設定できる要素が含まれます。たとえば、多くのUIコントロールには、ラベル用の下位クラスがあります。これらの定義は、スペースによって区切られた、クラスのセレクタと下位クラスのセレクタによって識別されます。
下位クラスのセレクタの例は、次のとおりです。
.check-box .label .check-box .box .radio-button .dot
擬似クラスを使用すると、ノードの状態(ノードにフォーカスが当たるタイミングなど)をカスタマイズできます。これらの定義は、コロン(:)によって区切られた、クラスのセレクタと状態の名前によって識別されます。
疑似クラスのセレクタの例は、次のとおりです。
.radio-button:focused .radio-button:hover .scroll-bar:vertical
ルールとプロパティ
スタイル定義のルールにより、クラスに関連付けられたプロパティに値を割り当てます。ルールのプロパティ名は、クラスのプロパティの名前に対応しています。複数の単語が含まれるプロパティ名は表記法により、ハイフン(-)を使用して単語が区切られます。JavaFXスタイル・シート内のスタイルのプロパティ名の先頭には-fx-
が付けられます。プロパティの名前と値はコロン(:)によって区切られます。ルールはセミコロン(;)で終わります。
ルールの例は、次のとおりです。
-fx-background-color: #333333; -fx-text-fill: white; -fx-alignment: CENTER;
.root
スタイル・クラスは、Scene
インスタンスのルート・ノードに適用されます。シーン・グラフのすべてのノードはルート・ノードの下位ノードであるため、.root
スタイル・クラス内のスタイルは任意のノードに適用できます。
.root
スタイル・クラスには、UI内での一貫性を保持するために他のスタイルで使用できるプロパティが含まれます。たとえば、プロパティ-fx-focused-base
は.root
スタイル内に定義されています。このプロパティは、他のUIコントロールのスタイルにより、そのコントロールにフォーカスが当てられたときの色として使用されます。次の定義は、クラスCheckBox
のスタイルでこのプロパティを使用する方法を示しています。
.check-box:focused { -fx-color: -fx-focused-base; }
シーンのスキニング
.root
スタイル・クラスをカスタマイズすることにより、UIの外観を簡単に変更できます。スタイル・シートのサンプルでは両方とも、フォントのサイズとファミリ、他の色の導出元となる基本色、およびシーンの背景色が設定されています。例37-3に、controlStyle2.cssの.root
スタイルを示します。
例37-3 controlStyle2.cssのルート・スタイル
.root{ -fx-font-size: 16pt; -fx-font-family: "Courier New"; -fx-base: rgb(132, 145, 47); -fx-background: rgb(225, 228, 203); }
このスタイルのみを使用して、図37-2の基本的な外観を作成します。これが可能なのは、組込みUIコントロールでは、ルート・ノードに設定されているプロパティを使用して独自の色とフォントを導出するからです。
スキニング・コントロール
使用している様々なコントロールのスタイルを定義することにより、UIをさらにカスタマイズできます。デフォルトのスタイル・シートの定義をオーバーライドしたり、新しいクラスまたはIDスタイルを作成できます。また、コード内のノードのスタイルを定義することもできます。
デフォルトのスタイルのオーバーライド
スタイル・シートにスタイルを組み込み、これに異なるプロパティを割り当てることにより、デフォルトのスタイル・シート内のスタイルをオーバーライドできます。例37-4に、controlStyle2.cssのButton
クラスのスタイルを示します。
例37-4 スタイルのオーバーライド
.button{ -fx-text-fill: rgb(49, 89, 23); -fx-border-color: rgb(49, 89, 23); -fx-border-radius: 5; -fx-padding: 3 6 6 6; }
この定義から、フォントの色、枠線の色、枠線の半径およびパディングが選択されます。ボタンの色とラベルのフォント・スタイルは、例37-3の.root
定義から選択されます。このスタイルが設定されたボタンは、次のイメージのようになります。

図button_style2.pngの説明
注意:
modena.cssスタイル・シートに定義されているスタイルがクラス内にない場合は、スタイル・シート内でスタイルを定義し、例37-6に示すように、各クラス・インスタンスにこれを割り当てます。たとえば、レイアウト・ペインには、modena.cssスタイル・シートに定義されているスタイルがありません。HBox
やGridPane
などのクラスのスタイルの作成の詳細は、「CSSを使用したレイアウト・ペインのスタイル設定」を参照してください。
クラス・スタイルの作成
クラス・スタイルの定義をスタイル・シートに追加することにより、クラス・スタイルを作成できます。例37-5では、controlStyle1.cssで.button1
と呼ばれる新しいスタイルを定義しています。
例37-5 新しいスタイルの定義
.button1{ -fx-text-fill: #006464; -fx-background-color: #DFB951; -fx-border-radius: 20; -fx-background-radius: 20; -fx-padding: 5; }
このスタイルが追加されたボタンは、次のイメージのようになります。ラベルのフォントはcontrolStyle1.css内の.root
定義から選択されることに注意してください。

図button_style1.pngの説明
このクラス・スタイルをノードに割り当てるには、メソッドのgetStyleClass().add()
シーケンスを使用します。例37-6に、「Accept」ボタンに割り当てられた.button1
スタイルを示します。
例37-6 クラス・スタイルの割当て
Button buttonAccept = new Button("Accept"); buttonAccept.getStyleClass().add("button1");
ノードに追加したスタイルは累積することに注意してください。.button1
クラス・スタイルをbuttonAccept
ノードに追加すると、このノードは.button
スタイルと.button1
スタイルの両方のルールを使用してレンダリングされます。
IDスタイルの作成
スタイルを作成し、このスタイルをノードに割り当てることにより、個別ノードのスタイルを定義できます。スタイル名は、先頭にハッシュ記号(#)が付いたIDです。例37-7では、#font-button
という名前のスタイルの定義を作成しています。
例37-7 IDスタイルの定義
#font-button { -fx-font: bold italic 20pt "Arial"; -fx-effect: dropshadow( one-pass-box , black , 8 , 0.0 , 2 , 0 ); }
ID font-button
が割り当てられたボタンは、次のイメージのようになります。

図button_style_id.pngの説明
例37-8に、このIDスタイルをノードに割り当てる方法を示します。
コード内のスタイルの設定
また、アプリケーションのコード内でノードのスタイル・プロパティを設定することもできます。コード内で設定されたルールの方が、スタイル・シートのスタイルより優先されます。例37-9に、ボタンの背景色とフォント色を変更する方法を示します。
例37-9 スタイル・インラインの定義
Button buttonColor = new Button("Color"); buttonColor.setStyle("-fx-background-color: slateblue; -fx-text-fill: white;");
次のイメージは、ボタンがどのように表示されるかを示しています。

図button_style_inline.pngの説明
その他の情報源
JavaFXのスタイル・シートの詳細は、JavaFX CSSリファレンス・ガイドを参照してください。
UIコントロールのスタイル設定の詳細は、「JavaFX UIコントロールの使用」を参照してください。
レイアウト・ペインのスタイル設定の詳細は、「CSSを使用したレイアウト・ペインのスタイル設定」を参照してください。
チャートのスタイル設定の詳細は、「CSSによるチャートのスタイル設定」を参照してください。