25 カラー・ピッカー
この章では、ColorPicker
コントロールについて説明し、その設計の概要を示し、これをJavaFXアプリケーションで使用する方法について説明します。
JavaFX SDKのカラー・ピッカー・コントロールは、使用可能な範囲から特定の色を選択したり、RGBまたはHSB組合せを指定して追加の色を設定できる一般的なユーザー・インタフェース・コンポーネントです。
設計の概要
ColorPicker
コントロールは、カラー・チューザ、カラー・パレットおよび「カスタム・カラー」ダイアログ・ウィンドウで構成されています。図25-1に、これらの要素を示します。
カラー・チューザ
カラー・ピッカーのカラー・チューザ要素は、有効なカラー・インジケータと対応するラベルがあるコンボ・ボックスで、図25-1の上部に表示されています。カラー・インジケータは、現在選択されているカラー名を表します。
カラー・ピッカー・コントロールのカラー・チューザの実装では、図25-2に示すカラー・チューザ要素の3つの表示形式(ボタン、分割メニュー・ボタンおよびコンボ・ボックス)を使用できます。
ボタン表示形式の場合、カラー・インジケータとラベルがある一般的なボタン・コントロールが提供されます。分割メニュー・ボタン表示形式の場合、コントロールのボタン部分がドロップダウン・メニューから分離されます。カラー・チューザのデフォルトの外観は、コンボ・ボックス表示形式です。この場合、ドロップダウン・メニューもありますが、ボタン部分から分離されません。
この表示形式を追加するには、対応するCSSクラスを使用します。カラー・ピッカーの外観を変更する方法の詳細は、「カラー・ピッカーの外観の変更」を参照してください。
カラー・パレット
カラー・パレットには、事前定義された一連の色と、「カスタム・カラー」ダイアログ・ウィンドウを指す「カスタム・カラー」リンクが含まれます。カラー・パレットの初期外観を図25-3に示します。
カスタム・カラーがすでに定義されている場合、図25-4に示すように、この色がカラー・パレットの「カスタム・カラー」領域に表示されます。
カラー・パレットは、上下左右キーを使用したナビゲーションをサポートしています。
一連のカスタム・カラーは、アプリケーション内に保存されていないかぎり、アプリケーションの再起動時に再ロードすることはできません。パレットまたはカスタム・カラー領域で選択した各色は、カラー・チューザのカラー・インジケータに表示されます。カラー・チューザ・ラベルにより、対応する16進数のWebカラー値がレンダリングされます。
「カスタム・カラー」ダイアログ・ウィンドウ
「カスタム・カラー」ダイアログ・ウィンドウは、カラー・パレット内の対応するリンクをクリックすることによって開くことができるモード・ウィンドウです。「カスタム・カラー」ウィンドウが開くと、カラー・チューザのカラー・インジケータに現在表示されている色の値が表示されます。ユーザーは、図25-5に示すように、カラー領域または垂直カラー・バーの上にマウス・カーソルを移動することによって新しい色を定義できます。ユーザーがカラー領域内の円またはカラー・バー内の四角形を操作するたびに、カラー値は対応するColorPicker
コントロールのプロパティに自動的に割り当てられます。
新しい色を定義するもう1つの方法は、HSB (Hue Saturation Brightness)またはRGB (Red Green Blue)の値を設定するか、対応するフィールドにWebカラー値を明示的に入力する方法です。図25-6に、カスタム・カラー設定の3つのペインを示します。
ユーザーは、不透明度スライダを動かすか0から100までの値を入力することにより、カスタム・カラーの透明度を設定することもできます。
すべての設定が完了し、新しい色が指定されたら、「使用」を使用して色を適用するか、「保存」をクリックして色をカスタム・カラー領域に保存できます。
カラー・ピッカーの使用
JavaFX SDKのColorPicker
クラスを使用して、JavaFXアプリケーション内でカラー・ピッカーをビルドします。カラー・ピッカーは、アプリケーション・シーン、レイアウト・コンテナまたはアプリケーション・ツールバーに直接追加できます。例25-1に、ColorPicker
オブジェクトを宣言する3つの方法を示します。
例25-1 カラー・ピッカー・コントロールの作成
//Empty contructor, the control appears with the default color, which is WHITE ColorPicker colorPicker1 = new ColorPicker(); //Color constant set as the currently selected color ColorPicker colorPicker2 = new ColorPicker(Color.BLUE); //Web color value set as the currently selected color ColorPicker colorPicker3 = new ColorPicker(Color.web("#ffcce6"));
図25-2に示すサンプルを使用して実行中のColorPicker
コントロールを評価してください。
例25-2 ColorPickerコントロールを使用したテキスト・コンポーネントの色の変更
import javafx.application.Application; import javafx.event.*; import javafx.scene.Scene; import javafx.scene.control.ColorPicker; import javafx.geometry.Insets; import javafx.scene.layout.HBox; import javafx.scene.paint.Color; import javafx.scene.text.*; import javafx.stage.Stage; public class ColorPickerSample extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { stage.setTitle("ColorPicker"); Scene scene = new Scene(new HBox(20), 400, 100); HBox box = (HBox) scene.getRoot(); box.setPadding(new Insets(5, 5, 5, 5)); final ColorPicker colorPicker = new ColorPicker(); colorPicker.setValue(Color.CORAL); final Text text = new Text("Try the color picker!"); text.setFont(Font.font ("Verdana", 20)); text.setFill(colorPicker.getValue()); colorPicker.setOnAction((ActionEvent t) -> { text.setFill(colorPicker.getValue()); }); box.getChildren().addAll(colorPicker, text); stage.setScene(scene); stage.show(); } }
この例では、カラー・ピッカーを作成し、色が変更された場合のその動作を定義しています。ColorPicker
クラスのgetValue
メソッドを介して取得されたColor
値は、Text
オブジェクトのsetFill
メソッドに渡されます。これが、選択した色が"Try the color picker!"テキストに適用される方法です。
このサンプルをコンパイルして実行すると、図25-7に示す出力が生成されます。この図は、新しく作成されたカスタム・カラーがText
コンポーネントに適用される瞬間を捉えています。
同様に、選択した色をグラフィカルNode
に適用できます。例25-3に、カラー・ピッカーを使用してTシャツをモデリングする方法を示します。
例25-3 ColorPickerコントロールを使用したグラフィカル・オブジェクトの色の変更
import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.ColorPicker; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.scene.control.ComboBox; import javafx.scene.control.ToolBar; import javafx.scene.effect.DropShadow; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.shape.SVGPath; import javafx.stage.Stage; public class ColorPickerSample extends Application { ImageView logo = new ImageView( new Image(getClass().getResourceAsStream("OracleLogo.png")) ); public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { stage.setTitle("ColorPicker"); Scene scene = new Scene(new VBox(20), 300, 300); VBox box = (VBox) scene.getRoot(); ToolBar tb = new ToolBar(); box.getChildren().add(tb); final ComboBox logoSamples = new ComboBox(); logoSamples.getItems().addAll( "Oracle", "Java", "JavaFX", "Cup"); logoSamples.setValue("Oracle"); logoSamples.valueProperty().addListener(new ChangeListener<String>() { @Override public void changed(ObservableValue ov, String t, String t1) { logo.setImage( new Image(getClass().getResourceAsStream(t1+"Logo.png")) ); } }); final ColorPicker colorPicker = new ColorPicker(); tb.getItems().addAll(logoSamples, colorPicker); StackPane stack = new StackPane(); box.getChildren().add(stack); final SVGPath svg = new SVGPath(); svg.setContent("M70,50 L90,50 L120,90 L150,50 L170,50" + "L210,90 L180,120 L170,110 L170,200 L70,200 L70,110 L60,120 L30,90" + "L70,50"); svg.setStroke(Color.DARKGREY); svg.setStrokeWidth(2); svg.setEffect(new DropShadow()); svg.setFill(colorPicker.getValue()); stack.getChildren().addAll(svg, logo); colorPicker.setOnAction((ActionEvent t) -> { svg.setFill(colorPicker.getValue()); }); stage.setScene(scene); stage.show(); } }
この例では、カラー・ピッカーで選択してgetValue
メソッドを介して取得した色がSVGPath
オブジェクトに適用されています。このサンプルにより、図25-8に示す出力が生成されます。
カラー・ピッカーを使用する場合、getCustomColors()
メソッドをコールすることにより、作成したカスタム・カラーを取得できます。これにより、作成した色に対応するColor
オブジェクトのObservableList
が返されます。これらをアプリケーションの起動時にカラー・ピッカーにアップロードすることはできません。ただし、カスタム・カラーの1つをColorPicker
値として設定できます(例25-4を参照)。
カラー・ピッカーの外観の変更
カラー・ピッカー・コントロールのデフォルトの外観は、com.sun.javafx.scene.control.skin.ColorPickerSkin
クラスによって定義されます。JavaFXアプリケーション内のカラー・ピッカーに別のスキンを適用するには、例25-5に示すように、color-picker
CSSクラスの-fx-skin
プロパティを再定義します。
例25-6に示すように、split-button
およびarrow-button
CSSクラスを使用して、JavaFXコード内のカラー・ピッカー・コントロールの外観を変更します。
例25-6 カラー・ピッカーの外観の設定
//Sets the split-menu-button colorPicker.getStyleClass().add("split-button"); //Sets the button colorPicker.getStyleClass().add("button");
modena
スタイル・シートに定義されている様々なCSSクラスを使用して、カラー・ピッカーのデフォルトのスタイルを変更し、その要素をカスタマイズすることもできます。このファイルを表示するには、JavaFX SDKがインストールされているディレクトリの下の\rt\lib\ext
ディレクトリに移動します。JARファイルからスタイル・シートを抽出するには、jar -xf jfxrt.jar com/sun/javafx/scene/control/skin/modena/modena.css
コマンドを使用します。CSSのクラスおよびプロパティの詳細は、「CSSによるJavaFXアプリケーションのスキニング」を参照してください。例25-7に、カラー・ピッカーのデフォルトの背景およびラベルを変更する方法を示します。
例25-7 カラー・ピッカーのデフォルトの外観の変更
.color-picker { -fx-background-color: #669999; -fx-background-radius: 0 15 15 0; } .color-picker .color-picker-label .text { -fx-fill: #ccffcc; }
scene.getStylesheets().add("colorpickersample/ControlStyle.css");
コードを使用して、これらのスタイルをControlStyle.css
ファイルに追加し、JavaFXアプリケーションでスタイル・シートを有効にしてから、ColorPickerSampleをコンパイルして実行します。図25-9に示すように、カラー・ピッカーの外観が変更されます。
ColorPicker
クラスはComboBoxBase
クラスの拡張であり、そのCSSプロパティを継承することに注意してください。combo-box-base
CSSスタイルの新しいスタイルを定義することにより、ColorPickerSampleアプリケーションのコンボ・ボックスとカラー・ピッカーを統合できます。ControlStyle.cssファイル内のスタイルを、例25-8に示すスタイルに置き換えます。
例25-8 combo-box-baseスタイルの設定
.tool-bar:horizontal { -fx-background-color: #b3e6b3; } .combo-box-base { -fx-background-color: null; } .combo-box-base:hover { -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 8, 0.0 , 0 , 0 ); }
適用したスタイルを使用してColorPickerSampleアプリケーションをコンパイルして実行すると、コンボ・ボックスとカラー・ピッカーは図25-10のようになります。
関連APIドキュメント