Java/JavaFX/JavaFX基本文型

Top > Java > JavaFX > JavaFX基本文型

JavaFX基本文型

JavaFXの基本文法を説明していきます。Javaがベースなので表現や言葉がありますが、違いがありますので気をつけてください。
プログラミングの基本になる、値は基本型とオブジェクトがあります。

基本型

基本となるデータ型は次のように分けられます。

  • 文字列 String
  • 数値 Integer, Number など
  • 論理値 Boolean
  • 時間間隔 Duration
  • Void,null
  • 関数 function

文字列

  • String
    JavaでのStringにあたります。
    文字列を表す場合、""(ダブルクォート)''(シングクォート)で文字列を囲みます。この2つの違いは特にありません。
    JavaではオブジェクトでしたがJavaFXScriptでは文字列型はStringで、基本的なデータ型として扱われます。
	var str1 :String = "JavaFX";
	var str2 :String = "Script";

	println("{str1}");
	println("{str2}");
	実行結果
	JavaFX
	Script

変数の定義に型名を指定しているが、式の右辺が文字列のため型名を省略することもできます。
ダブルコーテーション、シングコーテーションを混ぜて使用することは、できませんが
ダブルコーテーションで囲っている中でシングコーテーションを使用することはできます。
ダブルコーテーションで囲っている中でダブルコーテーション使用するためには\でエスケープします。

	var str3: String = "Hello, 'JavaFX'!!";
	var str4 :String = 'Hello, "Script"!!';
	//\エスケープが必要
	var str5: String = "Hello, \"JavaFX\"!!";
	var str6 :String = 'Hello, \'Script\'!!';

	println("{str3}");
	println("{str4}");
	println("{str5}");
	println("{str6}");
	実行結果
	Hello, 'JavaFX'!!
	Hello, "Script"!!
	Hello, "JavaFX"!!
	Hello, 'Script'!!
  • 変数、式を埋め込む
    文字列の中に{}が存在すると{}に埋め込まれた式が展開されます。
	var name = "daidouzi";
	var str = 'My name, {name}!!!';

	println(str);

	var x = 100;
	var y = 500;
	var sum = "{x} + {y} = {x + y}";
	var text = "My name, \{daidouzi\}";

	println(sum);
	println(text);
	実行結果
	My name, daidouzi!!!
	100 + 500 = 600
	My name, {daidouzi}

式の埋め込みを使用すると、数値を文字列に変換することもできます。
{}の中で{}を使用したいときは、\エスケープを使用します。

  • 文字連結
    文字列を連結するのはconcat関数を使用する。
    Javaの文字連結"java"+"fx"のように、+は使用できません。
    また式の埋め込みを使用して文字を連結することも可能です。
	var text1 = "Java";
	var text2 = "FX";
	var text3 = "World";
	var len1 = text1.concat(text2).concat(text3);

	println(len1);

	var text4 = "Net";
	var text5= "Beans";
	var len2 = "{text4}{text5}";

	println(len2)
	実行結果
	JavaFXWorld
	NetBeans
  • 複数行に渡る文字列を扱う場合
    文字列の途中に\nを書くことで表示するときに、改行される。
	var name ="My \nname \nis \ndaidouzi";
	println(name);
	実行結果
	My 
	name 
	is 
	daidouzi

数値

数値型は複数用意されています。

  • Integer
  • Number
  • Byte
  • Short
  • Long
  • Float
  • Double

IntegerはJavaのint、整数に対応。
NumberはJavaのdouble、浮動小数点に対応。
そのほかは、それぞれ,Javaのbyte,short,long,float,doubleに対応しています。

	var num1: Integer = 10;
	var num2: Number = 10.0;

	var num3 = 55; // Integerが使用される
	var num4 = 110.0; // Numberが使用される

IntegerからNumberへの代入は可能ですが逆は精度が落ちるため警告されます。

  • 型変換
    NumberからIntegerに変換するにはintValue関数を使用します。
	var a: Integer;
	var b: Number = 10.02;
	a = b.intValue();

	println("A: {a}");
 
	var c :Integer = 10.1.intValue();
 
	println("C: {c}")
	実行結果
	A: 10
	C: 10

intValue関数は直接数値にも使用できます。

  • キャスト
    型変換を行うにはキャストを使用する方法もあります。
    キャストを使用するには式の後に、as型名を記述します。
	var a: Integer = 100.0 as Integer;
	var b: Integer = (20 + 45.5) as Integer;

	var c: Number = 25.3;
	var d: Integer = c as Integer;

	println("A: {a} B: {b} C: {c} D: {d}");
	実行結果
	A: 100 B: 65 C: 25.3 D: 25

論理値

  • Boolean
    論理値はBooleanであらわす。
    値は、true、falseです。
    Javaのboolean同じ扱いです。
    否定演算子の使い方はJavaと異なる。
	var a: Boolean = true; 
	println("not a: {not a}");
	
	実行結果
	not a: false
	

否定するときは、notを使用する。

オブジェクト

Javaと同じようにJavaFXにもオブジェクトがあります。
オブジェクトを生成する方法を記述します。

オブジェクトを生成

まずJavaと同じように使用するクラスのimport文を記述します。
Rectangleクラスを使用するためには、

        import javafx.scene.shape.Rectangle;

オブジェクトを生成するには{}を使用します。

       クラス名{}

Javaクラスのオブジェクトを生成する場合にはnewを使用します。
JavaFXScriptは{}の中で変数の初期化を行う。
変数の初期化は、変数名:値と記述します。

	Rectangle {
	    x: 10
	    y: 10
	    width: 140 
	    height: 90
	    fill: Color.BLACK
	}

複数の変数の初期化を、1行で書くことも可能です。
文末はセミコロン、カンマ、なしでも可能です。

	Rectangle {
	    x: 10, y: 10
	    width: 140 height: 90
	}	

変数初期化のため、処理が必要な時は、

	クラス名 {
	    変数: {
	        //処理        
	        変数に代入したいオブジェクト
	    }
	}

{}の中の最後の行に変数に代入したい、オブジェクトを記述します。
returnを記述しなくても、関数の戻り値と同じようにオブジェクトが変数に代入されます。

	var num = 100;

	Num {
	    sum: {
	        var tmpSum = 0;
	        for (x in [0..num]) {
	            tmpSum += x;
	        }
	        tmpSum;
	    }
	}

Numオブジェクトのsum変数に0からnumの和が代入される。

変数

Javaと同じように変数を使用できますが、宣言方法が異なります。

var

変数は「var」キーワードを使用して定義する。

         var 変数名: 型;

変数の定義で、変数の初期化を行う場合は、変数の型が明らかなので省略できます。

	var hello = Text {
	    content: "Hello"
	};

式の右辺が、Textオブジェクトを表しているので自動的に変数helloはText型になります。
Javaでは型を省略できませんがJavaFXの変数宣言はJavaで例えると下記の様です。

	Text text = new Text();
	text.content = "Hello";

式の右辺のオブジェクトが異なる場合、型を指定します。

	var hello: Node = Text {
	    content: "sample"
	};

TextクラスはNodeクラスのサブクラスにあたります。

定数

一度だけ値を代入することができる定数も使用できます。

def

定数は「def」キーワードを使用する。

         def 変数名: 型 = 値;

定数は、必ず定義するときに初期化を行います。
定数は、あとからは変更できません。

	def num = 3.1415;
	def str = "JavaFX, World";

Javaで例えると修飾子finalです。

          final String str = "JavaFX, World";

あとからは変更できません。

配列

配列はJavaの配列に相当する概念です。

配列定義

配列は[]で囲い要素をカンマ区切りで記述します。

	var array1: Integer[];
	array1 = [0, 1, 2, 3, 4, 5];

	var array2: String[];
	array2 = ["Integer", "Number", "String", "Function"];

	var array3 = [0, 1, 2, 3, 4, 5];
	var array4 = ["Spring", "Aummer", "Autumn", "Winter"];

定義と初期化を同時に行えば型名は省略できます。

  • 多重配列はできません
    JavaFXScriptでは多重配列はできません。
    配列の中に配列を記述すると、展開されて1次元の配列になります。
	var array5 = ["Spring", "Aummer", "Autumn", "Winter"];
	var array6 = ["Integer", ["Number", "String"], "Function"];

	print("{array5.toString()} == {array6.toString()}: {array5 == array6}");
	実行結果
	[ Integer, Number, String, Function ] == [ Integer, Number, String, Function ]: true

式が展開されて、同一の配列とみられます。

  • toString関数
    ここではarray5.toString()のようにtoString関数を使用しています。
    toString関数を使用しないと要素を並べて表示されるためです。
	var array7 = ["Integer", "Number", "String", "Function"];
	println("{array7}");
	実行結果
	IntegerNumberStringFunction
		

toStrin関数を使用しないとカンマに区切られず要素が並べられて表示されてしまいます。

配列の代入

配列として定義した変数に配列でない要素を代入すると、指定した要素だけをもつ配列として解釈されます。

	var array8: Integer[];
	// 配列に配列でないものが代入された場合
	// 指定した要素のみを持つシーケンスとして解釈される
	array8 = 100;

	println("array8: {array8.toString()}");
	実行結果
	array8: [ 100 ]

変数array8に100を代入すると100だけを要素もつ配列と解釈されます。

  • そのほかの配列の定義方法
    配列はそのほかにも次のような定義もできます。
    • 始値と終値で指定した範囲
    • 始値と終値で指定した範囲 ただし終値は含まない
    • 始値と終値およびステップを指定した範囲
	// 範囲の指定
	var number1 = [1..10];
	// 範囲の指定 (終値を含まない)
	var number2 = [1..<10];
	// ステップを明記した範囲の指定
	var number3 = [1..10 step 2];
	// ステップには負の値も可
	var number4 = [10..0 step -2];

	println("number1: {number1.toString()}");
	println("number2: {number2.toString()}");
	println("number3: {number3.toString()}");
	println("number4: {number4.toString()}");
	実行結果
	number1: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
	number2: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
	number3: [ 1, 3, 5, 7, 9 ]
	number4: [ 10, 8, 6, 4, 2, 0 ]

ステップを負の値にする場合、始値が終値より大きくしてください。

  • for文に使用する
    配列を使用してfor文を定義できます。
	var nums = [0, 1, 2, 3, 4];
	var adds = for (value in nums) {
	    value * 2;
	};
	println(adds);
	実行結果
	[ 0, 2, 4, 6, 8 ]

配列から配列を作成

配列の部分を取り出して新しい配列を作成することもできます。
定義方法は次のように記述します。

          配列名[ 変数 | 論理式 ]

論理式がtrueになる要素が抽出され、新しい配列が生成されます。

	var nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

	//1 偶数のシーケンス
	var nums1 = nums[n | n mod 2 == 0];
	println("偶数: {nums1.toString()}");

	//2  5 未満のシーケンス
	var nums2 = nums[n | n < 5];
	println("5未満: {nums2.toString()}");

	//3 6 以上のシーケンス
	var nums3 = nums[n | n >= 6];
	println("6以上: {nums3.toString()}");

	var nodes:Node[] = [Rectangle{}, Circle{}, Text{}];

	//4 Circleオブジェクトのみ
	var circles = nodes[n | n instanceof Circle];
	println("Circle: {circles.toString()}");
	実行結果
	偶数: [ 0, 2, 4, 6, 8 ]
	5未満: [ 0, 1, 2, 3, 4 ]
	6以上: [ 6, 7, 8, 9 ]
	Circle: [ Circle [boundsInLocal=Rectangle2D [minX = 0.0, minY=0.0,.........省略]]

1の配列は各要素を2で割って、余りがない要素だけを抽出した配列を生成してます。
2の配列は要素の中から、5より小さい要素を抽出します。
3の配列は要素の中から、6以上の要素を抽出します。
4の配列はNodeクラスの配列です。この配列からCirclesオブジェクトだけを抽出します。
オブジェクトクラスをチェックするにはinstanceofを使用します。

  • 抽出
    インデックスによる抽出も可能です。
	var number = ["One", "Two", "Three", "Four", "Five", "Six", "Seven"];

	// 第3要素から第5要素
	var number2 = number[3..5];
	println("number2: {number2.toString()}");

	// 第2要素から第6要素の前
	var number3 = number[2..<6];
	println("number3: {number3.toString()}");

	// 第3要素以降
	var number4 = number[3..];
	println("number4: {number4.toString()}");

	// 第2要素以降,最終要素を含まず
	var number5 = number[2..<];
	println("number5: {number5.toString()}");
	実行結果
	number2: [ Four, Five, Six ]
	number3: [ Three, Four, Five, Six ]
	number4: [ Four, Five, Six, Seven ]
	number5: [ Three, Four, Five, Six ]

a..bは、a番目の要素からからb番目要素を抽出します。
a..<bは、a番目の要素からb番目の要素の前までの抽出します。
a..は、終りのインデントがない場合a番目の要素から最後までの意味です。
a..<は、a番目からの要素から最後の前の要素までの意味です。

  • 要素のアクセス
    配列の各要素のアクセスは[]内にインデックスを指定する。
    インデックスは0から始まります。
	var number = ["One", "Two", "Three", "Four", "Five", "Six", "Seven"];
	println("number[0]: {number[0]}");
	println("number[1]: {number[1]}");
	println("number[2]: {number[2]}");
	println("number[3]: {number[3]}");
	println("Size of number: {sizeof number}");
	実行結果
	number[0]: One
	number[1]: Two
	number[2]: Three
	number[3]: Four
	Size of number: 7

sizeof演算子を使用することで配列の長さを表すことができます。

要素の挿入、削除、更新

配列の任意の位置に要素を追加することができます。
更新、削除もできます。

  • 挿入
	// シーケンスの最後に挿入
	insert 挿入する要素 into シーケンス
	// インデックスで指定した要素の前に挿入
	insert 挿入する要素 before シーケンス[インデックス]
	// インデックスで指定した要素の後に挿入
	insert 挿入する要素 after シーケンス[インデックス]

要素を挿入するときはinaertを使用する。

	var array = ["One",  "Three", "Five", "Six"];

	insert "Two" into array;
	println("Twoを挿入: {array.toString()}");

	insert "Seven" before array[1];
	println("Seven を挿入: {array.toString()}");

	insert "Four" after array[3];
	println("Four を挿入: {array.toString()}");
	実行結果
	Twoを挿入: [ One, Three, Five, Six, Two ]
	Seven を挿入: [ One, Seven, Three, Five, Six, Two ]
	Four を挿入: [ One, Seven, Three, Five, Four, Six, Two ]

into arrayは、最後に挿入。
into array[1]は、array[1]に挿入。
into array[3]は、array[3]に挿入。

  • 更新
    要素の更新は、要素を指定し値を代入する。
	var array1 = ["One",  "Three", "Five", "Six"];
	array1[1] = "Two";

	println("ThreeをTwoに更新 : {array[1]}");
	実行結果
	ThreeをTwoに更新 : [ One, Two, Five, Six ]
  • 削除
    削除はdeleteを使用します。
    要素を直接選択する方法と、インデックスを指定する方法があります。
         delete 削除する要素 from シーケンス
         delete シーケンス[削除するインデックス]

要素を指定するときは、削除する要素の後にfromを付加し配列名を記述します。
インデックスを指定するときは、削除するインデックスを指定します。

	var array2 = ["One",  "Three", "Five", "Six"];
	delete "Six" from array2;

	println("Sixを削除します。:{array2.toString()}");

	delete array2[0];

	println("Oneを削除します。:{array2.toString()}");
	実行結果
	Sixを削除します。:[ One, Three, Five ]
	Oneを削除します。:[ Three, Five ]

配列の比較

配列が等しいことは、配列の長さが同じかつ要素が同じことになる。

	var num1 = [0, 1, 2, 3, 4, 5];
	var num2 = [0, 1, 2, 3, 4, 5, 6, 7, 8];
	var num3 = [0, 1, 2, 3, 4];
	var num4 = [5, 4, 3, 2, 1, 0, 0, 5, 8];
	var num5 = [];
	var num6 = [0, 1, 2, 3, 4, 5];
	var num7 = [0..8];
	var num8 = [0..<9];

	println("num1 == num2: {num1 == num2}");
	println("num1 == num3: {num1 == num3}");
	println("num1 == num4: {num1 == num4}");
	println("num1 == num5: {num1 == num5}");
	println("num1 == num6: {num1 == num6}");
	println("num1 == num7: {num1 == num7}");
	println("num1 == num8: {num1 == num8}");
	実行結果
	num1 == num2: false
	num1 == num3: false
	num1 == num4: false
	num1 == num5: false
	num1 == num6: true
	num1 == num7: false
	num1 == num8: false

定義の異なる配列も要素が同一なら等しいとみられます。

配列の演算

reverse演算子と、indexof演算子が使用できます。
reverse演算子は配列の要素の順番を逆にします。
indexof演算子はfor文とともに使用し、ループ中のインデックスを表します。

	var number1= ["One", "Two", "Three", "Four", "Five", "Six", "Seven"];
	var number2 = reverse number1;

	println("reverse number1: {number2.toString()}");

	for (num in number1) {
	    println("number1[{indexof num}]: {num}");
	}
	実行結果
	reverse number1: [ Seven, Six, Five, Four, Three, Two, One ]
	number1[0]: One
	number1[1]: Two
	number1[2]: Three
	number1[3]: Four
	number1[4]: Five
	number1[5]: Six
	number1[6]: Seven

reverse演算子を使用しても、元になる配列は変化しません。

関数

JavaFXScriptではJavaでいうメソッドを関数と呼びます。

function

関数の定義には「function」キーワードを使用する。

	function 関数名(引数1: 型, 引数2: 型): 戻り値の型 {
	    // 関数で行う処理 
	}

引数を2つとっていますが、引数がない場合と多数の引数でも可能です。

return

戻り値はreturnを使用。
return文がない時は一番最後の行を戻り値になります。

	function add(x: Number, y: Number): Number {
	    return x + y;
	} 
	function sub(x: Number, y: Number): Number {
	    // 下の行が戻り値になる
	    x - y;
	} 
	var num1 = 100.0;
	var num2 = 45.0;

	println("{num1} + {num2} = {add(num1, num2)}");
	println("{num1} - {num2} = {sub(num1, num2)}");
	
	実行結果
	100.0 + 45.0 = 145.0
	100.0 - 45.0 = 55.0

add関数はreturnがありますが、sub関数はreturnがありません。
sub関数は、最後の行のx-yが戻り値として返されます。
また、戻り値の型の定義を指定いない場合最後の行のオブジェクトの型が戻り値となります。

	function name(name: String){
             "My name, {name}!";
	};
	println(name("daidouzi"));	
        実行結果
         My name, daidouzi!

戻り値の型はStringにまります。

Void

戻り値のない場合はVoidを定義する。

	function name(name: String): Void {
	    println("My name, {name}!");
	};
	実行結果	
	name("daidouzi");

無名関数

名前のない無名関数を定義することもできます。
無名関数は関数名を表記する部分にfunctionと記述する。

	// 変数を関数型で定義し,後から無名関数を代入する
	var add: function(Number, Number): Number;

	add = function(x: Number, y: Number): Number {
	    return x + y;
	}
	// 変数の定義時に,無名関数を代入する
	var sub = function(x: Number, y: Number): Number {
	    x - y;
	}
	var num1 = 10.0;
	var num2 = 5.0;
	// 関数型の変数は,通常の関数と同様にコール可
	println("{num1} + {num2} = {add(num1, num2)}");
	println("{num1} - {num2} = {sub(num1, num2)}");
	実行結果
	101.0 + 15.0 = 116.0
	101.0 - 15.0 = 86.0

変数の定義に関数型を明示する場合は、引数と戻り値を記述します。
変数に無名関数を代入する場合、定義した引数と戻り値と合わせます。

時間間隔

時間間隔を表すDuration型あります。
時間間隔を表すことができます

Duration

時間間隔を表すDurationを使用できます。

	var onemillis = 1ms;   // 1 ミリ秒
	var onesec = 1s;       // 1 秒
	var onemin = 1m;       // 1 分
	var onehour = 1h;      // 1 時間

数値の後ろにスペースを入れずms,s,m,hのいずれか付加すると、
Durationとして扱われる。
それぞれミリ秒、秒、分、時間をあらわします。
日やナノ秒を直接表記できないので他の単位で表します。

	var onenanos = 0.001ms;   // 1 ナノ秒
	var oneday = 24h;         // 1 日

整数だけでなく小数点も扱えます。

	var onemillis = 1ms;   // 1 ミリ秒
	var onesec = 1s;       // 1 秒
	var onemin = 1m;       // 1 分
	var onehour = 1h;      // 1 時間

	println("{onesec}/1000 == {onemillis} : {onesec/1000 == onemillis}");
	println("{onehour} == {onemin} * 60 : {onehour == onemin*60}");
	実行結果
	1000ms/1000 == 1ms : true
	3600000ms == 60000ms * 60 : true

m,hで表しても内部的にはミリ秒で扱っている。

null

nullはデータ型でなく空を表す値です。

	var num: Integer[] = [];
	println("num == null : {num == null}");

	var str = "";
	println("srt == null : {str == null}");
	実行結果
	num == null : true
	srt == null : true

[]は配列を表します。変数numはInteger型の配列を表し要素はありません。
変数strは空の文字列です。要素、配列が空の場合は、nullと同等に扱われます。


アクセス総数5991件

最終更新日: 2009-09-03 (木) 22:22:33 (2972d)

このページをブックマーク:

このページのURL(コピペして利用下さい):

TOP