libro
www.tuyano.com
初心者のためのJavaFXプログラミング入門

プロパティのイベント処理について (2/4)

作成:2015-01-10 11:02
更新:2015-01-10 11:02

■ChangeListenerをToggleGroupに組み込む

では、作成したFXMLを読み込んで、ToggleGroupにイベント処理を組み込むコントローラークラスを作成してみましょう。

下に簡単なサンプルコードを掲載しておきました。実行してラジオボタンをクリックしてみましょう。するとウインドウ上部のラベルに「男である→女ですの」といったテキストが表示されます。選択前と選択後のそれぞれのRadioButtonに設定されたuserDataを表示しているのがわかります。

ここでは、ToggleGroupselectedTogglePropertyに設定されたReadOnlyObjectPropertyに、以下のような形でリスナーを組み込んでいますね。
《ReadOnlyObjectProperty》.addListener((ObservableValue<? extends Toggle> 
    observ, Toggle oldVal, Toggle newVal)->{
    // 実行する処理
});

ここではラムダ式を使って組み込む書き方を挙げておきます。ChangeListenerには、changedというメソッドが1つだけ定義されています。これは以下のような形をしています。
void changed(ObservableValue<? extends T> observable, T oldValue, T newValue)

ObservableValueは、総称型に対応しています。ToggleGroupselectedtogglePropertyに組み込まれている場合、「Toggle」というクラスを継承する形でObservableValueが用意されます。その他のoldValuenewValueToggleインスタンスとして渡されます。

このToggleというクラス(正確にはインスタンスですが)は、ON/OFFで扱われる値を管理するためのクラスです。このToggleから、変更された値に関する情報を取り出します。ここでは「getUserData」というメソッドを使っていますね。これにより、そのToggleに設定されているUserDataプロパティの値を取り出します。これは、FXMLに用意した「userData」属性の値です。

ReadOnlyObjectPropertyObservableValueToggleと見慣れないクラスがいくつも登場してわかりにくいかも知れませんが、基本的なプロパティ変更のイベントリスナー処理はどれも同じような形になっていますから、これらのイベント処理に慣れればどんなものも同じようなやり方で処理できるようになります。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

package com.tuyano.libro;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Toggle;
import javafx.scene.control.ToggleGroup;


public class AppController implements Initializable {
    @FXML Label label1;
    @FXML ToggleGroup group1;
    
    @Override
    public void initialize(URL location, ResourceBundle resources) {

        group1.selectedToggleProperty().addListener((ObservableValue<? extends Toggle> 
            observ, Toggle oldVal, Toggle newVal)->{
            String oldStr = (String)oldVal.getUserData();
            String newStr = (String)newVal.getUserData();
            label1.setText(oldStr + "→" + newStr);
        });
    }

}

※関連コンテンツ

「初心者のためのJavaFXプログラミング入門」に戻る