JavaFXではFXMLを使用して、GUIの構成を行うことを前回紹介しました。しかし、もう1つのGUIの基本であるイベント駆動については紹介できませんでした。そこで、今回はJavaFXでのイベント処理について紹介します。そのために、まずJavaFXのアプリケーションの基本的な構成について説明します。
JavaFXアプリケーションの構成
前回作成したJavaFXのサンプルはメインクラスとFXMLで構成していました。しかし、イベント処理を行っていないため、全く動きはありません。イベント処理を行うには、FXMLに記述している描画要素にアクセスし、表示している情報を取得、または更新できなくてはなりません。
このために、JavaFXではFXMLに対応したコントローラークラスを使用します。FXMLとコントローラークラスを結びつけることで、コントローラークラスから描画要素へアクセスできるようになります。また、描画要素からコントローラークラスのイベントハンドラをコールすることも可能になります。
そして、通常は表示を行う情報を保持するモデルが使われることが多いです。これを図示したのが、図1です。
メインクラスがFXMLをロードします。FXMLのロード時に、コントローラークラスも一緒にロードされ、インスタンスが生成されます。モデルについては特に制約はないので、メインクラスから生成したり、DIでインジェクションして生成します。図1では1つのFXMLとコントローラークラスから構成されていますが、必要に応じて複数のFXMLとコントローラークラスを使用します。
FXMLとコントローラークラスの対応付け
FXMLとコントローラークラスの対応付けは、FXMLで指定します。前回、FXMLのルート要素にxmlnsで名前空間を宣言することを説明しました。この名前空間で指定するスキーマに、コントローラークラスを指定するための属性が定義されています。
例えば、ルート要素がVBoxクラスというコンテナだとしましょう。この場合、コントローラークラスはリスト1のように指定します。
リスト1●FXMLでのコントローラクラスの指定
<VBox xmlns:fx="http://javafx.com/fxml/1"
fx:controller="コントローラクラス" >
省略
</VBox>
名前空間の指定が青字、コントローラークラスの指定が赤字部分です。リスト1に示したようにfx:controller属性でコントローラークラスを指定します。このように指定することで、FXMLのロード時にコントローラークラスもロードされ、インスタンス化されます。
描画要素との対応付け
コントローラークラスでは描画要素に対しアクセスして情報を取得、更新を行います。その発端になるのがイベント処理です。描画要素との対応付けは、サンプルを作りながら説明しましょう。
今回作成するのは、キーを入力すると、それに応じた値を出力するサンプルです。キーを入力するのはテキストフィールドです。入力した後に[Search]ボタンをクリックすると、キーに応じた値をラベルに表示します。GUIの表示を図2に示しました。
このサンプルのGUIの構成を図3に示します。
個々の要素について簡単に触れておきます。