アクションイベントを使う (3/4)
■EventHandlerとhandleEvent
EventHandlerは1つのメソッドを用意するだけのシンプルなインターフェイスです。public void handle(Event e)というメソッドを用意するだけで必要な処理が作成できます。ただし、これがそのまま使われることはあまりありません。
EventHandlerにあるhandleメソッドでは、発生したイベントを「Event」というクラスのインスタンスとして受け取るようになっています。このEventはイベントの種類ごとにたくさんのサブクラスをもっており、EventHandlerでは、どのイベント用のEventサブクラスが渡されるかを総称型で設定することができるようになっています。
例えば無名クラスを利用してEventHandlerを作成するような場合には、以下のように記述するでしょう。
が、アクションイベントでは、「ActionEvent」というEventのサブクラスが用意されており、これが引数に渡されます。そこでsetOnActionは、総称型を利用し、以下のように書くのが一般的といっていいでしょう。
総称型でActionEventを指定し、handleメソッドではActionEventが引数として渡されるように記述します。これでアクションイベントを処理するEventHandlerが用意できます。
では、実際にButtonにEventHandlerを組み込んでイベント処理するサンプルを下に挙げておきましょう。これはボタンをクリックすると、フィールドに入力したテキストを取り出してメッセージをラベルに表示するサンプルです。setOnActionで、new EventHandler<ActionEvent>()を設定しているのがわかるでしょう。
EventHandlerにあるhandleメソッドでは、発生したイベントを「Event」というクラスのインスタンスとして受け取るようになっています。このEventはイベントの種類ごとにたくさんのサブクラスをもっており、EventHandlerでは、どのイベント用のEventサブクラスが渡されるかを総称型で設定することができるようになっています。
例えば無名クラスを利用してEventHandlerを作成するような場合には、以下のように記述するでしょう。
new EventHandler() {
@Override
public void handle(Event e) {
// ここに処理を用意する
}
}
が、アクションイベントでは、「ActionEvent」というEventのサブクラスが用意されており、これが引数に渡されます。そこでsetOnActionは、総称型を利用し、以下のように書くのが一般的といっていいでしょう。
new EventHandler<ActionEvent>() {
public void handle(ActionEvent e) {
// ここに処理を用意する
}
}
総称型でActionEventを指定し、handleメソッドではActionEventが引数として渡されるように記述します。これでアクションイベントを処理するEventHandlerが用意できます。
では、実際にButtonにEventHandlerを組み込んでイベント処理するサンプルを下に挙げておきましょう。これはボタンをクリックすると、フィールドに入力したテキストを取り出してメッセージをラベルに表示するサンプルです。setOnActionで、new EventHandler<ActionEvent>()を設定しているのがわかるでしょう。
●プログラム・リスト●
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | package com.tuyano.libro;import javafx.application.Application;import javafx.event.ActionEvent;import javafx.event.EventHandler;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.control.Label;import javafx.scene.control.TextField;import javafx.scene.layout.BorderPane;import javafx.stage.Stage;public class App extends Application { Label label; TextField field; Button button; public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws Exception { label = new Label("This is JavaFX!"); field = new TextField(); button = new Button("Click"); // アクションイベント処理の組み込み button.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { String msg = "you typed: " + field.getText(); label.setText(msg); } }); BorderPane pane = new BorderPane(); pane.setTop(label); pane.setCenter(field); pane.setBottom(button); Scene scene = new Scene(pane, 320, 120); stage.setScene(scene); stage.show(); }} |