4 JavaFXでのフォームの作成
フォームの作成は、アプリケーション開発時の一般的なアクティビティです。このチュートリアルでは、画面レイアウトの基本、レイアウト・ペインへのコントロールの追加方法および入力イベントの作成方法について説明します。
このチュートリアルでは、JavaFXを使用して、図4-1に示すログイン・フォームをビルドします。
この開始チュートリアルで使用するツールは、NetBeans IDEです。開始する前に、使用しているNetBeans IDEのバージョンでJavaFX 8がサポートされていることを確認します。詳細は、「Java SE Downloads」ページの「Certified System Configurations」ページを参照してください。
プロジェクトの作成
最初のタスクは、NetBeans IDEでJavaFXプロジェクトを作成し、Loginという名前を付けることです。
-
「ファイル」メニューから、「新規プロジェクト」を選択します。
-
「JavaFX」アプリケーション・カテゴリで、「JavaFXアプリケーション」を選択します。「次」をクリックします。
-
プロジェクトにLoginという名前を付け、「終了」をクリックします。
JavaFXプロジェクトを作成すると、NetBeans IDEによりHello Worldアプリケーションが開始点として提供されますが、これについてはHello Worldチュートリアルを実行した場合はすでに確認しています。
-
NetBeans IDEによって生成されたソース・ファイルから
start()
メソッドを削除し、例4-1のコードに置き換えます。
ヒント: サンプル・コードをNetBeansプロジェクトに追加した後、[Ctrl] (または[Cmd])キーと[Shift]キーを押しながら[I]キーを押して、必要なパッケージをインポートします。import文の選択肢がある場合は、javafx
で始まるものを選択します。
GridPaneレイアウトの作成
ログイン・フォームではGridPane
レイアウトを使用しますが、これは、コントロールをレイアウトする、行および列の柔軟なグリッドを作成できるためです。グリッド内の任意のセルにコントロールを配置でき、必要に応じてコントロールが複数のセルにわたるようにすることができます。
例4-2に、GridPane
レイアウトを作成するコードを示します。このコードを行primaryStage.show();
の前に追加します。
例4-2 gapおよびpaddingプロパティが設定されたGridPane
GridPane grid = new GridPane(); grid.setAlignment(Pos.CENTER); grid.setHgap(10); grid.setVgap(10); grid.setPadding(new Insets(25, 25, 25, 25)); Scene scene = new Scene(grid, 300, 275); primaryStage.setScene(scene);
例4-2では、GridPane
オブジェクトが作成され、grid
という名前の変数に割り当てられます。alignmentプロパティによって、グリッドのデフォルトの位置は、シーンの左上から中央に変更されます。gapプロパティによって行と列の間隔が管理され、paddingプロパティによってグリッド・ペインのエッジの周りの領域が管理されます。インセットの順序は、上、右、下、左です。この例では、それぞれの側に25
ピクセルのパディングがあります。
シーンはグリッド・ペインをルート・ノードとして作成されますが、これはレイアウト・コンテナを使用する場合の一般的な手法です。したがって、ウィンドウがサイズ変更されると、グリッド・ペイン内のノードはレイアウト制約に従ってサイズ変更されます。この例では、ウィンドウを拡大または縮小したときに、グリッド・ペインは中央のままです。paddingプロパティによって、ウィンドウを小さくしたときにグリッド・ペインの周りにパディングができます。
このコードでは、シーンの幅と高さは300 x 275に設定されます。シーンの寸法を設定しない場合、シーンはデフォルトで、その内容を表示するために必要な最小サイズになります。
テキスト、ラベルおよびテキスト・フィールドの追加
図4-1を見ると、フォームには、タイトルのWelcomeと、ユーザーから情報を収集するテキストおよびパスワード・フィールドが必要なことがわかります。例4-3に、これらのコントロールを作成するコードを示します。このコードを、グリッドのpaddingプロパティを設定する行の後に追加します。
例4-3 コントロール
Text scenetitle = new Text("Welcome"); scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20)); grid.add(scenetitle, 0, 0, 2, 1); Label userName = new Label("User Name:"); grid.add(userName, 0, 1); TextField userTextField = new TextField(); grid.add(userTextField, 1, 1); Label pw = new Label("Password:"); grid.add(pw, 0, 2); PasswordField pwBox = new PasswordField(); grid.add(pwBox, 1, 2);
最初の行では、編集できないText
オブジェクトが作成され、テキストがWelcome
に設定されて、scenetitle
という名前の変数に割り当てられます。次の行では、setFont()
メソッドが使用され、scenetitle
変数のフォント・ファミリ、太さおよびサイズが設定されます。スタイルが変数にバインドされるインライン・スタイルの使用は適切ですが、ユーザー・インタフェースの要素をスタイル設定するためのさらによい手法は、スタイルシートを使用することです。次のチュートリアル「JavaFX CSSによる装飾的なフォーム」では、インライン・スタイルをスタイルシートに置き換えます。
grid.add()
メソッドによって、scenetitle
変数がレイアウトgrid
に追加されます。グリッド内の列および行の番号付けはゼロから始まり、scenetitle
は列0、行0に追加されます。grid.add
()
メソッドの最後の2つの変数によって、列は2に、行は1にまでわたるように設定されます。
次の行では、テキストがUser Name
のLabel
オブジェクトが列0、行1に作成され、編集可能なTextField
オブジェクトが作成されます。テキスト・フィールドは、グリッド・ペインの列1、行1に追加されます。同様に、パスワード・フィールドおよびラベルが作成されてグリッド・ペインに追加されます。
グリッド・ペインで作業するときに、デバッグに有効なグリッド線を表示できます。この場合、パスワード・フィールドを追加する行の後にgrid.setGridLinesVisible(true)
を追加できます。そうすると、アプリケーションを実行したときに、図4-2に示すように、グリッドの列および行とgapプロパティに対して線が表示されます。
ボタンおよびテキストの追加
アプリケーションに必要な最後の2つのコントロールは、データを送信するためのButton
コントロールと、ユーザーがボタンを押したときにメッセージを表示するためのText
コントロールです。
最初に、ボタンを作成して右下に配置しますが、これはフォーム全体に影響するアクションを実行するボタンの一般的な配置です。例4-4に、コードを示します。このコードをシーンのコードの前に追加します。
例4-4 ボタン
Button btn = new Button("Sign in"); HBox hbBtn = new HBox(10); hbBtn.setAlignment(Pos.BOTTOM_RIGHT); hbBtn.getChildren().add(btn); grid.add(hbBtn, 1, 4);
最初の行では、btn
という名前のボタンがラベルSign in
で作成され、2番目の行では、hbBtn
という名前のHBox
レイアウト・ペインが10
ピクセルの間隔で作成されます。HBox
ペインによって、グリッド・ペイン内の他のコントロールに適用される位置合せとは異なるボタンの位置合せが設定されます。alignment
プロパティの値はPos.BOTTOM_RIGHT
であり、これによってノードは縦の領域の一番下、横の領域の右端に配置されます。ボタンはHBox
ペインの子として追加され、HBox
ペインはグリッドの列1、行4に追加されます。
次に、例4-5に示すように、メッセージを表示するためのText
コントロールを追加します。このコードをシーンのコードの前に追加します。
図4-3に、現在のフォームを示します。チュートリアルの次の項「イベントを処理するコードの追加」を実行するまで、テキスト・メッセージは表示されません。
イベントを処理するコードの追加
最後に、ユーザーがボタンを押したときにテキスト・メッセージが表示されるようにします。例4-6のコードをシーンのコードの前に追加します。
例4-6 ボタン・イベント
btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { actiontarget.setFill(Color.FIREBRICK); actiontarget.setText("Sign in button pressed"); } });
setOnAction()
メソッドは、ユーザーがボタンを押したときにactiontarget
オブジェクトをSign in button pressed
に設定するイベント・ハンドラを登録するために使用されます。actiontarget
オブジェクトの色は赤レンガ色に設定されます。
アプリケーションの実行
「プロジェクト」ウィンドウでLoginプロジェクト・ノードを右クリックし、「実行」を選択して、「Sign in」ボタンをクリックします。図4-4に結果を示します。問題が発生した場合は、ダウンロード可能なLogin.zipファイルに含まれているLogin.java
ファイルのコードを確認してください。
次に実行すること
これで基本的なフォームのチュートリアルは終了ですが、引き続き、JavaFXアプリケーションの開発に関する次のチュートリアルを読むことができます。
-
「JavaFX CSSによる装飾的なフォーム」には、ログイン・フォームで背景イメージを追加し、テキスト、ラベルおよびボタンのスタイルを根本的に変更する方法に関するヒントがあります。
-
「FXMLを使用したユーザー・インタフェースの作成」では、ログイン・ユーザー・インタフェースを作成する別の方法が示されます。FXMLは、コードのアプリケーション・ロジックから切り離してユーザー・インタフェースをビルドするための構造を提供するXMLベースの言語です。
-
JavaFXでのレイアウトの操作では、組み込まれているJavaFXレイアウト・ペインと、それらを使用するためのヒントとテクニックが説明されています。
また、JavaFXのサンプルを試してみてください(http://www.oracle.com/technetwork/java/javase/downloads/
の「Java SE Downloads」ページのJDKの「Demos and Samples」セクションからダウンロードできます)。Ensembleサンプルには、レイアウトの例とそのソース・コードが含まれています。