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

ListViewとSelectionModel (5/5)

作成:2014-12-20 13:29
更新:2014-12-20 13:29

■SelectionModelにChangeListenerを設定する

このSelectionModelは、プロパティの変更に対応したイベント処理機能を持っています。例えば、SelectionModelにはSelectedItemというプロパティがあり、選択した項目などはgetSelectedItemメソッドで取り出すことができました。

このSelectedItemプロパティに「ChangeListener」というイベントリスナーを組み込むことで、値が変更された時のイベントをとらえて処理することができるようになります。ChangeListenerは、その名の通り値が変更された際に発生するイベント(ChangeEvent)を処理するためのイベントリスナーです。

これは、SelectionModelの「selectedItemProperty」というメソッドで取得したReadOnlyObjectPropertyというクラスの「addListener」メソッドで組み込むことができます。組み込みの仕方を整理すると以下のようになるでしょう。
《SelectionModel》.selectedItemProperty()
        .addListener(new ChangeListener(){

    @Override
    public void changed(ObservableValue observable, Object oldVal, Object newVal) {
        // 実行する処理
    }        
})
;
ChangeListenerには「changed」というメソッドが1つだけ用意されています。このメソッドにはObservableValueというクラスのインスタンスと、変更前・変更後の値が引数に渡されます。

「メソッドが1つだけ」ということではっとした人もいるかもしれませんね。そう、Java8ではメソッドが1つだけのインターフェイスはラムダ式に置き換えることができました。addListenerによるイベントリスナー組み込みをラムダ式で書くとこうなるでしょう。
《SelectionModel》.getSelectionModel().selectedItemProperty()
        .addListener(
    (ObservableValue observable, Object oldVal, Object newVal) -> {
        // 実行する処理
    }
);

こっちのほうがだいぶわかりやすいですね。こうしてChangeListenerを組み込むことで、値が変更された時(SelectedItemの値が変わったとき=選択状態が変更されたとき)の処理を用意することができるというわけです。

下に一切の簡単な利用例を挙げておきました。リストの項目を選択すると、「古い値 -> 新しい値という具合に値の変化がLabel1に表示されます。MouseClickを利用するより、こちらのほうがスマートでしょう。MouseClickだと、例えばキー操作などで選択項目を変更した場合などにはイベントが発生しませんが、ChangeListenerを利用すれば、どのような形であれ選択状態が変われば常にイベントが発生し処理することができます。

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

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

●プログラム・リスト●

package com.tuyano.libro;

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

import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;


public class AppController implements Initializable {
    @FXML Label label1;
    @FXML ListView list1;
    @FXML Button btn1;
    
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        list1.setItems(FXCollections.observableArrayList());
        list1.getItems().add("One");
        list1.getItems().add("Two");
        list1.getItems().add("Three");
        
        list1.getSelectionModel().selectedItemProperty().addListener(
            (ObservableValue observable, Object oldVal, Object newVal) -> {
                label1.setText(oldVal + " -> " + newVal);
            }
        );
        
        btn1.setOnAction((AtionEvent)->{
            Object obj = list1.getSelectionModel().getSelectedItem();
            label1.setText("you selected: \"" + obj.toString() + "\".");
        });
    }

}

※関連コンテンツ

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