変数のつづき

JavaFX では、変数をいろいろなところで定義できます。

import javafx.ui.*;

var text:String = "Hello, World!";

Frame {
    title: "変数のテスト"
    width: 200
    height: 100
    visible: true

    content: Label {
        text: text
    }
}

Java で考えると、違和感がありますが、クラスの中に変数を定義することもできます。

import javafx.ui.*;

Frame {
    // ここでも定義できるよ!
    var text:String = "Hello, World!"

    title: "変数のテスト"
    width: 200
    height: 100
    visible: true

    content: Label {
        text: text
    }
}

注意しなければいけないのが、セミコロンがいらない ということです。

ここで定義した変数は他のアトリビュートと同じように扱うことができます。

なんか動的にアトリビュートを追加できるような感じですね。でも、オブジェクトを生成するときにしか追加することができないので、動的な追加とはちょっと違います。

そういえば、ここで使用している変数は、そのオブジェクトの中で使用しているオブジェクトにも使うことができます。

なので、Label のテキストとして text 変数が使えるわけですね。

もちろん、次のように Label の中に書くこともできますよ。

import javafx.ui.*;

Frame {
    title: "変数のテスト"
    width: 200
    height: 100
    visible: true

    content: Label {
        // ここでももちろん OK
        var text:String = "Hello, World!"
        text: text
    }
}

でも、次の例はダメです。

import javafx.ui.*;

Frame {
    content: Label {
        var text:String = "Hello, World!"
        text: text
    }

    title: text // これは NG
    width: 200
    height: 100
    visible: true
}

実行すると、エラーが出ます

C:\OpenJFX\samples>java -cp ..\lib\*;. net.java.javafx.FXShell Hello
file:/C:/OpenJFX/samples/Hello.fx:9: undefined variable text in title: text

つまり、変数を定義しているオブジェクトの外側では参照できないということですね。