ドキュメント



JavaFX: JavaFX UIコンポーネントの操作

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に変更できます。

図37-1 スタイル1

図37-1の説明が続きます
「図37-1 スタイル1」の説明

図37-2 スタイル2

図37-2の説明が続きます
「図37-2 スタイル2」の説明

デフォルトのスタイル・シート

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がどのように表示されるかを示します。

図37-3 デフォルトのスタイル

図37-3の説明が続きます
「図37-3 デフォルトのスタイル」の説明

スタイル・シートの作成

独自のスタイル・シートを1つ以上作成し、デフォルトのスタイル・シート内のスタイルをオーバーライドしたり、独自のスタイルを追加できます。通常、作成したスタイル・シートの拡張子は.cssになり、JavaFXアプリケーションのメイン・クラスと同じディレクトリに配置されます。

スタイル・シートcontrolStyle1.cssにより、図37-1に示すスキニングが適用されます。スタイル・シートcontrolStyle2.cssにより、図37-2に示すスキニングが適用されます。

スタイル・シートは、図37-1に示すSceneオブジェクトに適用されます。この場合、pathは、スタイル・シートの場所を表すディレクトリ構造です。また、stylesheetは、スタイル・シートの名前です。たとえば、図37-2のスタイル・シートのパスと名前は、uicontrolcss/controlStyle2.cssです。

例37-1 スタイル・シートの追加

Scene scene = new Scene(new Group(), 500, 400);
scene.getStylesheets().add("path/stylesheet.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.cssButtonクラスのスタイルを示します。

例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の説明が続きます
図button_style2.pngの説明

注意:

modena.cssスタイル・シートに定義されているスタイルがクラス内にない場合は、スタイル・シート内でスタイルを定義し、例37-6に示すように、各クラス・インスタンスにこれを割り当てます。たとえば、レイアウト・ペインには、modena.cssスタイル・シートに定義されているスタイルがありません。HBoxGridPaneなどのクラスのスタイルの作成の詳細は、「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の説明が続きます
図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の説明が続きます
図button_style_id.pngの説明

例37-8に、このIDスタイルをノードに割り当てる方法を示します。

例37-8 IDスタイルの割当て

Button buttonFont = new Button("Font");
buttonFont.setId("font-button");

コード内のスタイルの設定

また、アプリケーションのコード内でノードのスタイル・プロパティを設定することもできます。コード内で設定されたルールの方が、スタイル・シートのスタイルより優先されます。例37-9に、ボタンの背景色とフォント色を変更する方法を示します。

例37-9 スタイル・インラインの定義

Button buttonColor = new Button("Color");
buttonColor.setStyle("-fx-background-color: slateblue; -fx-text-fill: white;");

次のイメージは、ボタンがどのように表示されるかを示しています。

button_style_inline.pngの説明が続きます
図button_style_inline.pngの説明

その他の情報源

JavaFXのスタイル・シートの詳細は、JavaFX CSSリファレンス・ガイドを参照してください。

UIコントロールのスタイル設定の詳細は、「JavaFX UIコントロールの使用」を参照してください。

レイアウト・ペインのスタイル設定の詳細は、「CSSを使用したレイアウト・ペインのスタイル設定」を参照してください。

チャートのスタイル設定の詳細は、「CSSによるチャートのスタイル設定」を参照してください。

ウィンドウを閉じる

目次

JavaFX: JavaFX UIコンポーネントの操作

展開 | 縮小