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

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

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

■スライダーのvaluePropertyをイベント処理する

スライダーも、値が変更された際のイベントを同じようなやり方で処理することができます。Sliderクラスでは、設定された値は「valueProperty」というプロパティとして扱われます。

これは「DoubleProperty」というクラスのインスタンスとしてプロパティを管理する機能が用意されています。このDoublePropertyaddListenerでイベントリスナーを組み込むことで、値が変更された際に処理を行わせることができます。

では、これも簡単なサンプルを作って試してみましょう。先ほどのFXMLで、<center>タグを以下のように書き換えて下さい。
<center>
    <Slider
fx:id="slider1" min="0" max="100" />
</center>

これで、スライダーが1つ表示されるようになります。これにイベント処理を組み込んで、操作したらリアルタイムに表示が更新されるようにしてみましょう。

下のリスト欄に簡単なサンプルを挙げておきます。これは、値を変更する前と変更後の値を取得して表示するサンプルです。スライダーを操作すると、「12.34567→98.7654」というような具合に、変更前の値と変更後の値が表示されます。

ここでは、スライダーへのイベントリスナー組み込みを以下のような形で行っています。
slider1.valueProperty().addListener……

SliderクラスのvaluePropertyで取得したDoublePropertyインスタンスに、addListenerでイベントリスナーを組み込みます。これは以下のような形になっていますね。
addListener((ObservableValue<? extends Number> 
        observ, Number oldVal, Number newVal)->{
    // イベント処理
});

ObservableValueは、Numberのサブクラスとして定義されています。そして渡される値は、Numberインスタンスになっています。後は、渡されたNumberからメソッドを呼び出して必要な値などを取得するだけです。
double oldnum = oldVal.doubleValue();
double newnum = newVal.doubleValue();

ここではdoubleValuedouble値として取り出し表示しています。整数値が欲しければ、intValueメソッドを使えばいいでしょう。

イベントリスナーと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.Label;
import javafx.scene.control.Slider;

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

        slider1.valueProperty().addListener((ObservableValue<? extends Number> 
                observ, Number oldVal, Number newVal)->{
            double oldnum = oldVal.doubleValue();
            double newnum = newVal.doubleValue();
            label1.setText(oldnum + "→" + newnum);
        });
    }
}

※関連コンテンツ

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