プロパティのイベント処理について (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); }); } }
※関連コンテンツ