2 コンビニエンス・メソッドの使用
このトピックでは、JavaFXアプリケーション内でイベント・ハンドラの登録に使用できるコンビニエンス・メソッドについて説明します。 マウス・イベント、キーボード・イベント、アクション・イベント、ドラッグ・アンド・ドロップ・イベント、ウィンドウ・イベントなどに対応するためのイベント・ハンドラを簡単に作成および登録する方法を取り上げます。
JavaFXクラスの中には、イベント・ハンドラ・プロパティを定義することによってイベント・ハンドラを登録できるものもあります。 イベント・ハンドラ・プロパティをユーザー定義のイベント・ハンドラに設定すると、そのハンドラが自動的に登録され、対応するイベント・タイプが渡されるようになります。 イベント・ハンドラ・プロパティのセッター・メソッドは、イベント・ハンドラを登録するためのコンビニエンス・メソッドです。
コンビニエンス・メソッドの使用
コンビニエンス・メソッドの多くは、Nodeクラスに定義されており、そのすべてのサブクラスから利用できるようになっています。 コンビニエンス・メソッドは他のクラスにも含まれています。 表2-1に、コンビニエンス・メソッドを使用して処理できるイベント、およびコンビニエンス・メソッドが定義されているクラスを示します。
表2-1 イベント処理用のコンビニエンス・メソッドが含まれているクラス
| ユーザー・アクション | イベント・タイプ | クラス |
|---|---|---|
|
キーボード上のキーの押下 |
|
|
|
マウスの移動またはマウス・ボタンの押下 |
|
|
|
完全なマウス・アクション(押下-ドラッグ-解放)の実行 |
|
|
|
代替文字入力方法(一般に外国語)による入力の生成、変更、削除またはコミット |
|
|
|
プラットフォームでサポートされているドラッグ・アンド・ドロップ・アクションの実行 |
|
|
|
オブジェクトのスクロール |
|
|
|
オブジェクトに対する回転ジェスチャの実行 |
|
|
|
オブジェクトに対するスワイプ・ジェスチャの実行 |
|
|
|
オブジェクトへのタッチ |
|
|
|
オブジェクトに対するズーム・ジェスチャの実行 |
|
|
|
コンテキスト・メニューのリクエスト |
|
|
|
ボタンの押下、コンボ・ボックスの表示/非表示、またはメニュー項目の選択 |
|
|
|
リスト、テーブルまたはツリー内の項目の編集 |
|
|
|
メディア・プレーヤでのエラーの発生 |
|
|
|
メニューの表示/非表示 |
|
|
|
ポップアップ・ウィンドウの非表示 |
|
|
|
タブの選択またはタブを閉じる |
|
|
|
ウィンドウを閉じるまたはウィンドウの表示/非表示 |
|
|
イベント・ハンドラを登録するためのコンビニエンス・メソッドの形式は次のとおりです。
setOnEvent-type(EventHandler<? super event-class> value)
Event-typeは、ハンドラによって処理されるイベントのタイプです。たとえば、KEY_TYPEDイベントの場合はsetOnKeyTypedになり、MOUSE_CLICKEDイベントの場合はsetOnMouseClickedになります。event-classは、イベント・タイプを定義するクラスです。たとえば、キーボード入力に関連するイベントの場合はKeyEventになり、マウス入力に関連するイベントの場合はMouseEventになります。 文字列<? super event-class>は、メソッドの引数としてevent-classのイベント・ハンドラを渡すことも、そのスーパークラスのいずれかのイベント・ハンドラを渡すこともできることを意味しています。 たとえば、イベントがキーボード・イベントまたはマウス・イベントのいずれかである場合は、InputEventのイベント・ハンドラを使用できます。
次の文は、キー入力の発生時、つまりキーの押下および解放が行われたときに生成されるイベントを処理するためのイベント・ハンドラを登録するメソッドの定義です。
setOnKeyTyped(EventHandler<? super KeyEvent> value)
コンビニエンス・メソッドのコールでハンドラを匿名クラスとして定義することによって、イベント・ハンドラを1つのステップで作成および登録できます。 イベント・ハンドラでは、handle()メソッドを実装して、イベントの処理に必要なコードを記述する必要があります。
NetBeans IDEを使用してJavaFXアプリケーションを作成する場合に生成されるコードに、コンビニエンス・メソッドの使用例が示されています。 JavaFXアプリケーションの作成時に「アプリケーション・クラスの作成」オプションを選択した場合、作成されるメイン・クラスに"Hello World"アプリケーションが含まれています。 例2-1に、生成されるコードを示します。
例2-1 Hello Worldの例
package yourapplication;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
public class YourApplication extends Application {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World");
Group root = new Group();
Scene scene = new Scene(root, 300, 250);
Button btn = new Button();
btn.setLayoutX(100);
btn.setLayoutY(80);
btn.setText("Hello World");
btn.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
System.out.println("Hello World");
}
});
root.getChildren().add(btn);
primaryStage.setScene(scene);
primaryStage.show();
}
}
"Hello World"のコードでは、1つのボタンが配置されたウィンドウを作成しています。 setOnAction()メソッドを使用して、ボタンがクリックされたときにディスパッチされるアクション・イベントを処理するためのイベント・ハンドラを登録しています。 イベント・ハンドラでは、handle()メソッドを使用してイベントを処理し、"Hello World"という文字列がコンソールに出力されるようにしています。
マウス・イベントの例
マウス・イベントのイベント・ハンドラを登録するためのコンビニエンス・メソッドには、setOnMouseEntered、setOnMouseExitedおよびsetOnMousePressedがあります。 例2-2に、これらのイベント・ハンドラのサンプルを示します。
例2-2 マウス・イベントのサンプル・イベント・ハンドラ
final Circle circle = new Circle(radius, Color.RED);
circle.setOnMouseEntered(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
System.out.println("Mouse entered");
}
});
circle.setOnMouseExited(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
System.out.println("Mouse exited");
}
});
circle.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
System.out.println("Mouse pressed");
}
});
類似のイベント・ハンドラの使用例を参照するには、Ensembleサンプルを実行します。Ensembleサンプルは、Java SEダウンロード・ページのJDKデモおよびサンプルのセクションからダウンロード可能なJavaFXサンプルに含まれています。 Ensembleサンプルでは、イベント・ハンドラのソース・コードも提供されています。
キーボード・イベントの例
キーボード・イベントのイベント・ハンドラを登録するためのコンビニエンス・メソッドには、setOnKeyPressedおよびsetOnKeyReleasedがあります。 例2-3に、これらのイベント・ハンドラのサンプルを示します。
例2-3 キーボード・イベントのサンプル・イベント・ハンドラ
final TextField textBox = new TextField();
textBox.setPromptText("Write here");
textBox.setOnKeyPressed(new EventHandler<KeyEvent>() {
public void handle(KeyEvent ke) {
System.out.println("Key Pressed: " + ke.getText());
}
});
textBox.setOnKeyReleased(new EventHandler<KeyEvent>() {
public void handle(KeyEvent ke) {
System.out.println("Key Released: " + ke.getText());
}
});
類似のイベント・ハンドラの使用例を参照するには、Ensembleサンプルを実行します。Ensembleサンプルは、Java SEダウンロード・ページのJDKデモおよびサンプルのセクションからダウンロード可能なJavaFXサンプルに含まれています。 Ensembleサンプルでは、イベント・ハンドラのソース・コードも提供されています。

