プロパティのイベント処理について (3/4)
作成:2015-01-10 11:07
更新:2015-01-10 11:07
更新:2015-01-10 11:07
■ComboBoxのSelectionModelをイベント処理する
続いて、ComboBoxについてです。これは、実はListViewがわかればほとんど同じ感覚で扱うことができます。
ComboBoxにも、選択状態を管理するモデルクラスが設定されたプロパティがあり、これは「getSelectionModel」で選択モデルクラスを得ることができます。
そして、そのselectedItemPropertyで得られるプロパティにaddListenerでイベントリスナーを設定することで、選択変更時の処理を組み込むことができます。
では、これもやってみましょう。先ほどのFXMLにあった<center>内を以下のように書き換えます。
これで、String値を項目として設定したComboBoxが用意できました。後は、このイベント処理をコントローラークラスに用意するだけですね。
下のリスト欄にサンプルを掲載しておきました。ここでは、ComboBoxに総称型としてStringを指定していますね。このような形です。
これで、String値を項目として持つことが設定されます。イベントリスナーは、以下のようにして組み込みます。
getSelectionModelで得られた選択モデルのselectedItemPropertyに対してaddListenerします。ちょっとややこしいですね。そして組み込むイベントリスナーは以下のような形で定義されます。
第1引数、ObservableValue<? extends String> observというような形で定義されています。ComboBoxの定義で<String>が指定されていますので、、ObservableValueもextends Stringしたクラスとして定義されます。後は、変更前と変更後の値がそれぞれStringとして渡されます。
この「ObservableValueは、そこに保管される値をextendsする形で作成される」というのは、なんとも不思議な感覚でしょう。なにしろ、実際にプログラムを書いて、恥得てObservableValueのスーパークラスが何か決まるのですから。ちょっとわかりにくいですが、「選択モデルで設定されるクラスを継承してObservableValueは用意される」ということを覚えておきましょう。
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>が指定されていますので、、ObservableValueもextends Stringしたクラスとして定義されます。後は、変更前と変更後の値がそれぞれStringとして渡されます。
この「ObservableValueは、そこに保管される値をextendsする形で作成される」というのは、なんとも不思議な感覚でしょう。なにしろ、実際にプログラムを書いて、恥得てObservableValueのスーパークラスが何か決まるのですから。ちょっとわかりにくいですが、「選択モデルで設定されるクラスを継承してObservableValueは用意される」ということを覚えておきましょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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);
});
}
}
※関連コンテンツ