アクションイベントを使う (4/4)
■ラムダ式で更に簡潔に!
これでButtonをクリックした際のアクションイベントは完成です。が、無名クラスを利用した書き方は、ちょっと面倒臭いんですね。これをもっとシンプルに使う工夫をしてみましょう。
EventHandlerインターフェイスでは、handleというメソッドが1つだけ用意されています。こうした「1つしかメソッドが用意されていないインターフェイス」は、Java8では「関数インターフェイス」と呼ばれます。これは、関数オブジェクト(関数を値として扱うためのもの)の代用品(?)のように扱うことができるようになっています。
それを可能にするのが「ラムダ式」です。Java8でラムダ式を使ったことがない、という人も多いでしょうから簡単にまとめておきましょう。
ラムダ式は、関数インターフェイスの無名クラスによるインスタンス実装を非常にシンプルに記述することの出来る機能です。このsetOnActionの例でいえば、以下のように変わります。
・通常の書き方
・ラムダ式の書き方
猛烈にシンプルになっているのがわかるでしょう。ラムダ式では、メソッドを書く必要がありません。関数インターフェイスの場合は、呼び出すメソッドは1つしかないんですから、そのメソッドが呼び出されると自動的に判断するんです。
下に、先ほどのサンプルをラムダ式に書き換えたものを掲載しておきます。イベント処理の実装部分が非常にわかりやすくなっているでしょう? せっかくJava8でJavaFXを使うんですから、ぜひラムダ式を利用した書き方を覚えておきましょう!
EventHandlerインターフェイスでは、handleというメソッドが1つだけ用意されています。こうした「1つしかメソッドが用意されていないインターフェイス」は、Java8では「関数インターフェイス」と呼ばれます。これは、関数オブジェクト(関数を値として扱うためのもの)の代用品(?)のように扱うことができるようになっています。
それを可能にするのが「ラムダ式」です。Java8でラムダ式を使ったことがない、という人も多いでしょうから簡単にまとめておきましょう。
ラムダ式は、関数インターフェイスの無名クラスによるインスタンス実装を非常にシンプルに記述することの出来る機能です。このsetOnActionの例でいえば、以下のように変わります。
・通常の書き方
《Button》.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent e) {
// ここに処理を書く
}
});・ラムダ式の書き方
《Button》.setOnAction((ActionEvent)-> {
// ここに処理を書く
});
猛烈にシンプルになっているのがわかるでしょう。ラムダ式では、メソッドを書く必要がありません。関数インターフェイスの場合は、呼び出すメソッドは1つしかないんですから、そのメソッドが呼び出されると自動的に判断するんです。
下に、先ほどのサンプルをラムダ式に書き換えたものを掲載しておきます。イベント処理の実装部分が非常にわかりやすくなっているでしょう? せっかくJava8でJavaFXを使うんですから、ぜひラムダ式を利用した書き方を覚えておきましょう!
●プログラム・リスト●
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 | 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((ActionEvent)-> { 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(); }} |