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

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

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

■ComboBoxのSelectionModelをイベント処理する

続いて、ComboBoxについてです。これは、実はListViewがわかればほとんど同じ感覚で扱うことができます。

ComboBoxにも、選択状態を管理するモデルクラスが設定されたプロパティがあり、これは「getSelectionModel」で選択モデルクラスを得ることができます。

そして、そのselectedItemPropertyで得られるプロパティにaddListenerでイベントリスナーを設定することで、選択変更時の処理を組み込むことができます。

では、これもやってみましょう。先ほどのFXMLにあった<center>内を以下のように書き換えます。
<ComboBox fx:id="combo1">
<items>
    <FXCollections fx:factory="observableArrayList">
        <String fx:value="One" />
        <String fx:value="Two" />
        <String fx:value="Three" />
    </FXCollections>
</items>
</ComboBox>

これで、String値を項目として設定したComboBoxが用意できました。後は、このイベント処理をコントローラークラスに用意するだけですね。

下のリスト欄にサンプルを掲載しておきました。ここでは、ComboBoxに総称型としてStringを指定していますね。このような形です。
@FXML ComboBox<String> combo1;

これで、String値を項目として持つことが設定されます。イベントリスナーは、以下のようにして組み込みます。
combo1.getSelectionModel().selectedItemProperty().addListener ……

getSelectionModelで得られた選択モデルのselectedItemPropertyに対してaddListenerします。ちょっとややこしいですね。そして組み込むイベントリスナーは以下のような形で定義されます。
addListener((ObservableValue<? extends String> observ,
        String oldVal, String newVal)->{
    // イベントの処理
});

第1引数、ObservableValue<? extends String> observというような形で定義されています。ComboBoxの定義で<String>が指定されていますので、、ObservableValueextends Stringしたクラスとして定義されます。後は、変更前と変更後の値がそれぞれStringとして渡されます。

この「ObservableValueは、そこに保管される値をextendsする形で作成される」というのは、なんとも不思議な感覚でしょう。なにしろ、実際にプログラムを書いて、恥得てObservableValueのスーパークラスが何か決まるのですから。ちょっとわかりにくいですが、「選択モデルで設定されるクラスを継承してObservableValueは用意される」ということを覚えておきましょう。

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

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.ComboBox;
import javafx.scene.control.Label;


public class AppController implements Initializable {
    @FXML Label label1;
    @FXML ComboBox<String> combo1;
    
    @Override
    public void initialize(URL location, ResourceBundle resources) {

        combo1.getSelectionModel().selectedItemProperty().
            addListener((ObservableValue<? extends String> observ,
                    String oldVal, String newVal)->{
            label1.setText(oldVal + "→" + newVal);
        });
    }
}

※関連コンテンツ

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