1. 概要

この短いチュートリアルでは、 JavaFXボタンコンポーネントを見て、ユーザーインタラクションを処理する方法を確認します。

2. アプリケーションのセットアップ

まず、イベントハンドラーに集中できる小さなアプリケーションを作成しましょう。 ボタンを含む単純なFXMLレイアウトの作成から始めましょう。

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<BorderPane xmlns:fx="http://javafx.com/fxml"
    xmlns="http://javafx.com/javafx"
    fx:controller="com.baeldung.button.eventhandler.ButtonEventHandlerController"
    prefHeight="200.0" prefWidth="300.0">
    <center>
        <Button fx:id="button" HBox.hgrow="ALWAYS"/>
    </center>

    <bottom>
        <Label fx:id="label" text="Test label"/>
    </bottom>
</BorderPane>

ButtonEventHandlerControllerクラスを作成しましょう。 これは、UI要素とアプリケーションロジックを接続する役割を果たします。 initializeメソッドでボタンのラベルを設定します。

public class ButtonEventHandlerController {

    private static final Logger logger = LoggerFactory.getLogger(ButtonEventHandlerController.class);

    @FXML
    private Button button;

    @FXML
    private Label label;

    @FXML
    private void initialize() {
        button.setText("Click me");
    }
}

アプリケーションを起動しましょう。 中央に「Clickme」というタイトルのボタンがあり、ウィンドウの下部にテストラベルがあります。

3. [イベント]をクリックします

単純なクリックイベントの処理と、初期化メソッドへのイベントハンドラーの追加から始めましょう。

button.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        logger.info("OnAction {}", event);
    }
});

これをテストしてみましょう。 ボタンをクリックすると、新しいログメッセージが表示されます。

INFO c.b.b.e.ButtonEventHandlerController - OnAction javafx.event.ActionEvent[source=Button[id=searchButton, styleClass=button]'Click me']

イベントハンドラーインターフェイスにはメソッドが1つしかないため、関数インターフェイスとして扱い、これらの行を単一のラムダ式に置き換えて、コードを読みやすくすることができます

searchButton.setOnAction(event -> logger.info("OnAction {}", event));

別のクリックイベントハンドラーを追加してみましょう。 この行をコピーしてログメッセージを変更するだけで、アプリケーションをテストするときに違いを確認できます。

button.setOnAction(event -> logger.info("OnAction {}", event));
button.setOnAction(event -> logger.info("OnAction2 {}", event));

これで、ボタンをクリックすると、「OnAction2」メッセージのみが表示されます。 これは、2番目の理由で発生します setOnAction メソッド呼び出しは、最初のイベントハンドラーを2番目のイベントハンドラーに置き換えました。

4. さまざまなイベント

マウスのプレス/リリース、ドラッグ、キーボードイベントなど、他の種類のイベントも処理できます。

ボタンにホバー効果を追加しましょう。 カーソルがボタンの上にカーソルを合わせ始めると影が表示され、カーソルがボタンから離れると効果が削除されます。

Effect shadow = new DropShadow();
searchButton.setOnMouseEntered(e -> searchButton.setEffect(shadow));
searchButton.setOnMouseExited(e -> searchButton.setEffect(null));

5. イベントハンドラーの再利用

場合によっては、同じイベントハンドラーを複数回使用したいことがあります。 マウスの2番目のボタンをクリックしたときにボタンのフォントサイズを大きくするイベントハンドラーを作成しましょう。

EventHandler<MouseEvent> rightClickHandler = event -> {
    if (MouseButton.SECONDARY.equals(event.getButton())) {
        button.setFont(new Font(button.getFont().getSize() + 1));
    }
};

ただし、イベントに関連付けていないため、機能はありません。 ボタンとラベルのマウスプレスイベントにこのイベントハンドラーを使用してみましょう。

button.setOnMousePressed(rightClickHandler);
label.setOnMousePressed(rightClickHandler);

ここで、アプリケーションをテストし、ラベルまたはボタンの2番目のマウスボタンでクリックすると、フォントサイズが大きくなっていることがわかります。

6. 結論

イベントハンドラーをJavaFXボタンに追加し、イベントのタイプに応じてさまざまなアクションを実行する方法を学びました。

いつものように、コードの実装はGitHub利用できます。