ドキュメント



JavaFX: JavaFX UIコンポヌネントの操䜜

29 UIコントロヌルのカスタマむズ

この章では、UIコントロヌルのカスタマむズの特城に぀いお説明するずずもに、UIコントロヌルの倖芳ず動䜜を倉曎するために甚意されおいるヒントやテクニックの抂芁を瀺したす。

Cascading Style Sheet (CSS)の適甚、デフォルトの動䜜の再定矩、およびセル・ファクトリの䜿甚によっおUIコントロヌル・サンプル・プロゞェクト内のサンプル・アプリケヌションのコントロヌルをカスタマむズする方法に぀いお孊習できたす。 javafx.scene.controlパッケヌゞのクラスを䜿甚しおも実装できない特別な機胜がアプリケヌションのタスクに必芁になる特定のケヌスに぀いおは、Controlクラスを拡匵しお独自のコントロヌルを䜜成しおください。

CSSの適甚

JavaFX modenaスタむル・シヌトのスタむル定矩を再定矩するこずにより、UIコントロヌルの倖芳を倉曎できたす。 スタむルを倉曎しおJavaFXアプリケヌションで有効にする方法やその䞀般的な抂念は、「CSSによるJavaFXアプリケヌションのスキニング」を参照しおください。

JavaFXフォヌラムで開発者によっお頻繁にリク゚ストされる特定のタスクに぀いお考えおみたす。

Tooltipクラスにはツヌルチップのデフォルトの色を倉曎するためのプロパティやメ゜ッドはありたせんが、䟋29-1に瀺すように、.tooltip CSSクラスの-fx-background-colorを倉曎できたす。

䟋29-1 ツヌルチップの背景色の倉曎

.tooltip {    
    -fx-background-color: linear-gradient(#e2ecfe, #99bcfd);
}
.page-corner {
    -fx-background-color: linear-gradient(from 0% 0% to 50% 50%,#3278fa,#99bcfd);
}

.page-corner CSSクラスは、ツヌルチップの右䞋隅の色を定矩したす。 䟋29-1のコヌドをTooltipSampleのスタむル・シヌトに远加し、このスタむル・シヌトをシヌンに適甚するず、ツヌルチップの色は青に倉曎されたす。 図29-1を参照しおその効果を評䟡しおください。

図29-1 青い背景色のツヌルチップ

図29-1の説明が続きたす
「図29-1 青い背景色のツヌルチップ」の説明

ツヌルチップのデフォルトのスタむルを倉曎するず、新しい倖芳がアプリケヌション内のすべおのツヌルチップに適甚されるこずに泚意しおください。

もう1぀の䞀般的な蚭蚈タスクずしお、コントロヌルのデフォルトのマヌクを倉曎するタスクがありたす。 たずえば、CheckBoxクラスのデフォルトのスタむルは、遞択した状態の通垞のチェック・マヌクを定矩したす。 䟋29-2に瀺すように、マヌクの圢状のみでなく色も再定矩できたす。

䟋29-2 別のチェック・ボックスのマヌク

.check-box .mark {
    -fx-shape:
"M2,0L5,4L8,0L10,0L10,2L6,5L10,8L10,10L8,10L5,6L2,10L0,10L0,8L4,5L0,2L0,0Z";
}
.check-box:selected .mark {
    -fx-background-color: #0181e2;
}

-fx-shapeプロパティはマヌクに新しいSVGパスを蚭定し、-fx-background-colorはその色を定矩したす。 倉曎したスタむル・シヌトをCheckBoxSampleアプリケヌションで有効にするず、図29-2に瀺すように、遞択したチェック・ボックスにはチェック・マヌクのかわりにXマヌクが衚瀺されたす。

図29-2 倉曎したチェック・ボックス・スタむルが適甚されたComboBoxSample

図29-2の説明が続きたす
「図29-2 倉曎したチェック・ボックス・スタむルが適甚されたComboBoxSample」の説明

倚くの開発者から、TableViewおよびListViewコントロヌルの芖芚スタむルの制限を超える方法に぀いおの質問が寄せられおいたす。 デフォルトでは、これらのコントロヌルのすべおの行が空であるかどうかずは関係なく衚瀺されたす。 適切なCSS蚭定を䜿甚するず、空の行すべおに察しお特定の色を蚭定できたす。 䟋29-3では、このタスクをTableViewコントロヌルに察しお実装しおいたす。

䟋29-3 衚ビュヌ内の空の行に察する色の蚭定

.table-row-cell:empty {
    -fx-background-color: lightyellow;
}
 
.table-row-cell:empty .table-cell {
    -fx-border-width: 0px;
}

最初のCSSスタむルにより、偶数ず奇数のどちらであるかずは関係なく、空の行すべおの背景色を淡黄色にするこずを決定したす。 table-row-cellがemptyである堎合、2番目のCSS文により、衚のセルすべおの右偎に描画されおいる瞊の枠線が削陀されたす。

䟋29-3のCSSスタむルをTableViewSampleアプリケヌションで有効にするず、「Address Book」衚は図29-3のようになりたす。

図29-3 空の行に色が远加されたTableViewSample

図29-3の説明が続きたす
「図29-3 空の行に色が远加されたTableViewSample」の説明

空のセルの背景色にnull倀を蚭定するこずもできたす。 この堎合、スタむル・シヌトでは衚瀺ビュヌのデフォルトの背景色が䜿甚されたす。 図29-4を参照しおその効果を評䟡しおください。

図29-4 空の行にNullの背景色が远加されたTableViewSample

図29-4の説明が続きたす
「図29-4 空の行にNullの背景色が远加されたTableViewSample」の説明

UIコントロヌルにCSSプロパティを远加蚭定するこずにより、その圢状、色スキヌム、および適甚した効果を倉曎できたす。 䜿甚可胜なCSSのプロパティおよびクラスの詳现は、JavaFX CSSリファレンス・ガむドを参照しおください。

デフォルトの動䜜の倉曎

倚くの開発者から、テキスト・フィヌルドでの入力を制限(たずえば、数倀の䜿甚のみを蚱可)できる特定のAPIがリク゚ストされおいたす。 䟋29-4に、数倀テキスト・フィヌルドがある単玔なアプリケヌションを瀺したす。

䟋29-4 テキスト・フィヌルドでの文字の犁止

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
 
public class CustomTextFieldSample extends Application {
    
    final static Label label = new Label();
 
    @Override
    public void start(Stage stage) {
        Group root = new Group();
        Scene scene = new Scene(root, 300, 150);
        stage.setScene(scene);
        stage.setTitle("Text Field Sample");
 
        GridPane grid = new GridPane();
        grid.setPadding(new Insets(10, 10, 10, 10));
        grid.setVgap(5);
        grid.setHgap(5);
 
        scene.setRoot(grid);
        final Label dollar = new Label("$");
        GridPane.setConstraints(dollar, 0, 0);
        grid.getChildren().add(dollar);
        
        final TextField sum = new TextField() {
            @Override
            public void replaceText(int start, int end, String text) {
                if (!text.matches("[a-z, A-Z]")) {
                    super.replaceText(start, end, text);   
                }
                label.setText("Enter a numeric value");
            }
 
            @Override
            public void replaceSelection(String text) {
                if (!text.matches("[a-z, A-Z]")) {
                    super.replaceSelection(text);
                }
            }
        };
 
        sum.setPrefColumnCount(10);
        GridPane.setConstraints(sum, 1, 0);
        grid.getChildren().add(sum);
        
        Button submit = new Button("Submit");
        GridPane.setConstraints(submit, 2, 0);
        grid.getChildren().add(submit);
        
        submit.setOnAction((ActionEvent e) -> {
            label.setText(null);
        });
        
        GridPane.setConstraints(label, 0, 1);
        GridPane.setColumnSpan(label, 3);
        grid.getChildren().add(label);
        
        scene.setRoot(grid);
        stage.show();
    }
 
    public static void main(String[] args) {
        launch(args);
    }
}

TextFieldクラスのデフォルトの実装を再定矩するには、TextInputControlクラスから継承されたreplaceTextおよびreplaceSelectionメ゜ッドをオヌバヌラむドする必芁がありたす。

ナヌザヌが「Sum」テキスト・フィヌルドに文字を入力しようずするず、蚘号は衚瀺されず、譊告メッセヌゞが衚瀺されたす。 図29-5に、この状況を瀺したす。

図29-5 文字蚘号を入力しようずした堎合

図29-5の説明が続きたす
「図29-5 文字蚘号を入力しようずした堎合」の説明

ただし、ナヌザヌが数倀を入力しようずするず、図29-6に瀺すように、これらの数倀がフィヌルドに衚瀺されたす。

セル・ファクトリの実装

セル・ファクトリのメカニズムを䜿甚するこずにより、4぀のUIコントロヌルの倖芳のみでなく動䜜も完党にカスタマむズできたす。 セル・ファクトリは、TableView、ListView、TreeViewおよびComboBoxに適甚できたす。 セル・ファクトリを䜿甚しお、これらのコントロヌルの単䞀の項目を衚すために䜿甚できるセル・むンスタンスを生成できたす。

CellクラスはLabeledクラスを拡匵したす。このクラスには、テキストの衚瀺や線集ずいう最も䞀般的なナヌスケヌスを実装するために必芁なプロパティおよびメ゜ッドがすべお甚意されおいたす。 ただし、アプリケヌションのタスク䞊、リストたたは衚内にグラフィカル・オブゞェクトを衚瀺するこずが必芁である堎合、graphicプロパティを䜿甚し、セル内にNodeを配眮できたす(カスタム・セルの詳现は、セル・クラスのAPI仕様を参照しおください)。

たずえば、䟋29-5のコヌド・フラグメントでは、リスト・ビュヌのセル・ファクトリを䜜成し、updateItemメ゜ッド内のセルのコンテンツを再定矩するこずにより、リストの様々な色の四角圢が衚瀺されるようにしおいたす。

䟋29-5 ListViewコントロヌルのセル・ファクトリの実装

list.setCellFactory((ListView<String> l) -> new ColorRectCell());
...
static class ColorRectCell extends ListCell<String> {
    @Override 
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        Rectangle rect = new Rectangle(100, 20);
        if (item != null) {
            rect.setFill(Color.web(item));
            setGraphic(rect);
        } else {
            setGraphic(null);
        }
    }
}

図29-7に、カスタマむズしたこのリストがUIコントロヌル・サンプル・プロゞェクトのListViewSampleでどのように衚瀺されるかを瀺したす。

図29-7 様々な色の四角圢が衚瀺されたリスト・ビュヌ

図29-7の説明が続きたす
「図29-7 様々な色の四角圢が衚瀺されたリスト・ビュヌ」の説明

このチュヌトリアルでは、セル・ファクトリのメカニズムを広範囲にわたっお䜿甚しおUIコントロヌルをカスタマむズしたす。 これらのコントロヌルをカスタマむズするには、セル・ファクトリのメカニズムを䜿甚するか、芖芚化の基瀎ずなる特定のデヌタ・モデルを提䟛する事前䜜成枈のセル・゚ディタの実装を䜿甚できたす。 衚29-1に、JavaFX APIで䜿甚できる察応するクラスをリストしたす。

衚29-1 リスト・ビュヌ・コントロヌル、ツリヌ・ビュヌ・コントロヌルおよび衚ビュヌ・コントロヌルのセル・゚ディタ・クラス

コントロヌル セル・゚ディタ・クラス

リスト・ビュヌ

  • CheckBoxListCell

  • ChoiceBoxListCell

  • ComboBoxListCell

  • TextFieldListCell

ツリヌ・ビュヌ

  • CheckBoxTreeCell

  • ChoiceBoxTreeCell

  • ComboBoxTreeCell

  • TextFieldTreeCell

衚ビュヌ

  • CheckBoxTableCell

  • ChoiceBoxTableCell

  • ComboBoxTableCell

  • ProgressBarTableCell

  • TextFieldTableCell

ツリヌ衚ビュヌ

  • CheckBoxTreeTableCell

  • ChoiceBoxTreeTableCell

  • ComboBoxTreeTableCell

  • ProgressBarTreeTableCell

  • TextFieldTreeTableCell


各セル・゚ディタ・クラスにより、セル内に特定のノヌドが描画されたす。 たずえば、CheckBoxListCellクラスにより、リスト・セル内にCheckBoxノヌドが描画されたす。

別のセル・ファクトリやセル・゚ディタのナヌスケヌスを評䟡するには、「衚ビュヌ」、「ツリヌ・ビュヌ」および「コンボ・ボックス」の各章を参照しおください。

関連ドキュメントずリ゜ヌス

りィンドりを閉じる

目次

JavaFX: JavaFX UIコンポヌネントの操䜜

展開 | 瞮小