Java/JavaFX/JavaFXとは

Top > Java > JavaFX > JavaFXとは

JavaFXについて?

JavaFXとは

最近、ネットや本屋さんで目や耳にすることが増えてきているJavaFXを簡単に説明したいと思います。

JavaFXとは何ぞや?

JavaFXは、RIA をさまざまな環境で実現するための プラットフォームです。
RIAと言うとFlashやAJAXのようなものが思い浮かびますが、JavaFXはPC、TV、MOBILE、カーナビなどデバイスを問わず操作性、表現力に優れたwebアプリを実現できる技術です。
Javaの実行環境があれば、その上で動作するGUIアプリケーション開発にもそのまま利用することができます。
「Javaプラットフォーム上で動作するRIA技術」といわれています。

表現豊かなUIコンテンツをデバイスを問わずに実行できること、「デバイスを問わずに」が一番のポイントになるのでわないかと思います。

JavaFXは「スクリプト言語である」という点に特徴があります。
JREなどの実行環境があれば、その上で動作するGUIアプリケーション開発にもそのまま利用することができます。
Javaでは複雑で難しかったアニメーションが簡単に作成でき、サウンドや、ムービーも簡単に扱うことができます。

JavaFXはJava仮想マシンで実行されるRIA実行する環境になるのですが、他の意味も持ちます。

  • JavaFX Script
    JavaFXアプリケーションを作るスクリプト。
  • JavaFX Mobile
    JavaFXアプリケーションが動くための携帯端末用の実行環境。

名前は違うが2つは異なる様式ではありませんが、携帯端末は性能が限られているので、実行環境が別途必要になっています。
よくJavaFXと表現していますがこれは、「JavaFXScript」のことを一般的に指しています。

JavaFXは、非常にシンプルなスクリプト言語の形をしています。Swingと同等レベルのGUIを構築できながら、GUI部品と図形を描画するプログラムを簡単にかくことができます。Swingの場合高度な記述ができましが、記述が長くなったり何重も入れ子構造になったり、複雑でコードの量も大量になってしまうことがあります。JavaFXは単に書くのが簡単というだけでなく、Javaとの統合が容易なのでJavaベースのライブラリと組み合わせて斬新なUIを作り出せることも可能です。JavaFX は、一から開発したものではなく、Java プラットフォーム上に構築されているため、Java プラットフォームのパワーと機能をシームレスに活用できる。Javaの技術をベースに構築されているため,Javaとの相性がよいです。

Webブラウザ上で動かしたアプリケーションを、そのままデスクトップ環境に移して、ローカルアプリケーションとして利用することもできます。アプリケーションはローカルにキャッシュして、ショートカットを置くことができるのでアプリケーションの配布、インストール方法としても簡単になっています。

「Write once, run anywhere」(一度書けば、どこでも実行できる)を実現したJava言語に続き、Java FXが目指しているのは「Write once, displays anywhere」(一度書けば、どこでも表示できる)という世界なのでJava FXは魅力的だと思います。
Java技術は、複数のデバイスと画面に対応されておりワールドワイドの推定で90%以上のPC、85%以上の携帯端末に搭載されてます。これらはすべて、JavaFXを実行する基盤となりうる可能性があります。

Webデザイナー向けのツール「JavaFX 1.0 Production Suite」も提供され、PhotoshopやIllustratorのアートワークをJavaFXアプリケーションに簡単に取り込むようなことも可能となっています。

詳しい内容は↓からどうぞ。
JavaFXホームページhttp://javafx.com/ja/

JavaFXはJavaプログラムで動くのでJava実行環境JREをインストールが必要です。
インストール方法はこちらから
インストール方法?

JavaFX Scriptの特徴

JavaFX Scriptの特徴は次のように大きく分けられます。

  • オブジェクト指向
  • 宣言的文法
  • 静的型付け
  • バインド
  • 置換トリガ

宣言的文法

  • 宣言的文法はオブジェクトの生成、初期化で使用されます。
    JavaFXScriptはオブジェクトの生成を、クラス名 + { }で行います。
	Stage { }

Stageクラスのオブジェクトを生成します。

  • JavaFXScriptでは変数と関数をもつ。
    変数の初期化はオブジェクト生成時に行うことができます。
    変数の初期化は{ }の中で変数名と値をコロンでつなぎます。
	Stage {
		title: "World"
		width:  200
		height: 200
	}

Stageオブジェクトの変数titleに"World"、変数widthに200.変数heidhtに200代入している。
Javaのコンストラクタとは違い、JavaFXScriptでは変数の初期化に順番はありません。
すべての変数を初期化する必要もありません。

  • 関数の型が存在するため関数型の変数に関数を代入することもできる。
	Stage {
		title: "World"
		width:  200
		height: 200
			//関数を代入
			onClose: function() {
		        System.exit(0);
		    }
	}

onClose変数に関数を代入。

  • オブジェクトの初期化を入れ子にすることも可能。
	Stage {
	    title: "Good"
	    width: 300
	    height: 300
	 
	    onClose: function() {
	        System.exit(0);
	    }
	    //Sceneオブジェクトを生成、代入
	    scene: Scene {
	        content: SwingLabel {
	            font: Font {
	                size: 20
	            }
	            text: "JavaFX, World!"
	        }
	    }
	}

Stageオブジェクトの変数scneにSceneオブジェクトを生成し代入している。
Sceneオブジェクトの変数contentにSwingLabel?オブジェクトを生成し代入している。
SwingLabel?オブジェクトの変数fontにFontオブジェクトを生成し代入している。
ツリー構造をそのままスクリプトと表せることができる。

  • Javaで表現
    Javaで同じ内容を表現すると次のようになる。
	public class Daidouzi {
	    public Daidouzi() {
	        JFrame frame = new JFrame("Good");
	 
	        frame.setSize(300, 300);
	        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	 
	        JLabel label = new JLabel("JavaFX, World!");
	        Font font = new Font(Font.SANS_SERIF, Font.PLAIN, 20);
	        label.setFont(font);
	 
	        frame.add(label);
	 
	        frame.setVisible(true);
	    }
	 
	    public static void main(String[] args) {
	        SwingUtilities.invokeLater(new Runnable() {
	            public void run() {
	                new Daidouzi();
	            }
	        });
	    }
	}

比べてみるとJavaFXのほうが自分は見やすく感じます。

静的型付け

JavaFXScriptでは静的型付けを採用しています。
変数を「var」キーワードで定義し変数名の後にコロンを書き、型名を書きます。

   var num: Integer;
   
   var sum = 100;

100はIntegerであることが明らかな場合、
型の定義を省略することもできる。

バインド

  • バインド
    JavaFXScriptでは情報が自動的に同期される。
    これをバインドと言い、バインドするときは、
    「bind」キーワードを使用する。
	var a = 100;
	//変数bにバインドする。
	var b = bind a;
	//出力
	println("B: {b}"); 
	a = 200; 
	println("B: {b}");
	実行結果
	B: 100
	B: 200

変数aの値100が途中で200に更新しています。
変数bに変数aをバインドしているので変数bも自動的に200に更新します。
bindを使用できるのは変数の初期化のときです。
初期化のときに式の右辺にbindを書きそのあとに同期をとりたい変数を書きます。
printlnはJavaでいうSystem.out.printlnに相当します。
println("B: {b}")の文字列の{}は変数、式が展開されます。

  • バインドを式にする
    バインドを式にすることもできます。
	var a = 100;
	//変数bにバインドする。
	var b = bind a * 10;
	//出力
	println("B: {b}"); 
	a = 200; 
	println("B: {b}");
	実行結果
	B: 1000
	B: 2000

変数bは変数aを10倍した値に自動的に更新されさます。

  • 複数の変数とバインドする。
    複数の変数とバインドすることもできます。
	var a = 100;
	var b = 200;
	//変数cを(a + b)にバインドする。
	var c = bind a + b;
	//出力
	println("C: {c}"); 
	a = 300; 
	println("C: {c}");
	b = 500; 
	println("C: {c}");
	実行結果
	C: 300
	C: 500
	C: 800

変数cを変数aと変数bの和にバインドし、aとbのどちらかが更新されてもcが更新されます。

  • 関数の引数をバインドする。
    関数をバインドするときは、関数定義の前に「bound」キーワードを書きます。
    そして、変数の初期化のときにbindをつけて関数をコールします。
	bound function add(x: Integer, y: Integer): Integer {
	    return x + y;
	}
	 
	var a = 100;
	var b = 200;
	var c = bind add(a, b);
	//出力
	println("C: {c}"); 
	a = 300; 
	println("C: {c}");
	b = 500; 
	println("C: {c}");
	実行結果
	C: 300
	C: 500
	C: 800

関数の引数に使用したa、bが更新すると自動的に関数が評価され、cの値が更新します。

  • 双方向バインド
    通常のバインドは一方的でbindされた変数を更新できません。
    「with inverse」キーワードを使用すると、双方向のバインドが可能です。
	var a = 100;
	//双方向バインド
	var b = bind a with inverse;
	//出力
	println("A: {a} B: {b}"); 
	a = 200; 
	println("A: {a} B: {b}");
	b = 300; 
	println("A: {a} B: {b}");
	実行結果
	A:100 B: 100
	A:200 B: 200
	A:300 B: 300

常に対応する2つの変数は、同じものと扱われるようになり変数aを変更しても変数bを変更しても両変数は同じ値になっています。双方向バインドの場合は変数を使用した式は記述することはできません。

置換トリガ

置換トリガは変数が変更された時に決められた処置を行うときに使用します。
置換トリガは変数の定義時に設定することができます。
定義の後に「on replace」キーワードを使用します。

         //置換トリガ設定
	var value: String on replace oldValue {
	     println("chang");
	     println("old value: {oldValue}");
	     println("new value: {value}");
	};
 
        実行結果      
	chang
	old value: 
	new value: 

	chang
	old value: 
	new value: Java

	chang
	old value: Java
	new value: JavaFX

oldValueには、変更前の値が代入されている。oldValueは省略可能です。
変数valueを定義しただけで初期化を行ってないので値がnullとして置換トリガが呼び出されます。定義とともに初期化も可能です。

	//置換トリガ設定
	var value: String = "Hello" on replace oldValue {
	     println("chang");
	     println("old : {oldValue}");
	     println("new : {value}");
	};
	//値代入
	value = "Java";
	value = "JavaFX";
        実行結果
        chang
	old : 
	new : Hello
	chang
	old : Hello
	new : Java
	chang
	old : Java
	new : JavaFX

on replaceの前に変数に値を代入すると、newにHelloが表示されます。

時間間隔

時間間隔を表すことができます。
時間感覚の型は、Duration型です。

	var dur1: Duration = 10ms; // 10ミリ秒
	var dur2: Duration = 1s; // 1秒
	var dur3: Duration = 1m; // 1分
	
	println("{dur1} * 100 == {dur2}? {dur1* 100== dur2}");
	実行結果
	10ms * 100 == 1000ms? true

変数dur1は10ミリ秒なので100倍すると1秒になります。
変数dur2が1000msと表示されてます。
結果を見てみると1sと値を代入しても内部的にはミリ秒で保持されていることになっているようです。


アクセス総数:4604

最終更新日: 2009-09-03 (木) 22:09:48 (2880d)

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

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

TOP