本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

JavaFX Script で作るリッチ・アプリケーション

JavaFX Script の基本を学ぶための手引き

Cathy Kegley (ckegley@us.ibm.com), Software Engineer, IBM
Cathy Kegley は、IBM Lotus Expeditor クライアント・チームのソフトウェア・エンジニアです。
Greg Roberts (gwrobert@us.ibm.com), Staff Software Engineer, IBM
Greg Roberts は、IBM Lotus Expeditor クライアント開発チームのスタッフ・ソフトウェア・エンジニアです。

概要: 昨年春にデビューした JavaFX Script は、Java SE (Java™ Platform, Standard Edition 6) 上で動作し、高度なユーザー・インターフェースを簡単にコーティングできるようにするスクリプト言語です。この記事を読んで、JavaFX スクリプト言語の基本事項を学ぶとともに、サンプル・アプリケーションの作成を通して基本的な UI コンポーネントについて理解してください。

日付:  2008年 1月 15日
レベル:  中級 この記事の原文:  英語
アクティビティー: 3766 ビュー
お気軽にご意見・ご感想をお寄せください: 


JavaFX Script は、リッチ・クライアントとインターネット・アプリケーションを簡単に作成できるようにするために設計されたスクリプト言語です。極めて移植性の高いこの言語は、ローカルにインストールしなくても、Java 技術をサポートするシステムであればどのシステム上でも実行することができます。JavaFX Script を使えば、基礎となる Java 技術を利用して、どんなサイズの GUI でも、どんなに複雑な GUI を難なく作成することができます。

この記事では JavaFX Script 言語の基礎をひと通り紹介した後、サンプル・アプリケーションを用いて UI コンポーネントのいくつかを説明します。この記事を理解するには、Java プログラミング言語についての十分な理解と Swing で開発した経験が必要です。

JavaFX Script のライセンス供与

JavaFX Script は、この記事を書いている時点では Sun Microsystems の JavaFX 製品ファミリーに属しています (その他にこの製品ファミリーに含まれるものは現在のところ、Java 技術対応デバイスを対象としたオペレーティングおよびアプリケーション環境である JavaFX Mobile のみです)。Sun では、将来 JavaFX Script はGNU Public License v2 の元でライセンス供与される予定だと発表しています。それまでは JavaFX Community が中心となって、JavaFX Script 言語の初期バージョンを共有し、その開発に取り組んでいくことになります (「参考文献」を参照)。

JavaFX Script を使い始める前に

JavaFX Script でアプリケーションを開発する際には、JavaFX Script 開発環境がインストールされていると役立ちます。この環境には、JavaFX Script 専用に設計された IDE だけでなく、その他の Java 開発環境用の JavaFX Script プラグインも用意されています。この記事でのアプリケーション開発にお勧めするのは、Eclipse 用 JavaFX Script プラグインです (このプラグインならびに他の開発オプションについての詳細は、「参考文献」を参照してくだい)。


JavaFX Script の概要

JavaFX Script は静的型付き言語です。つまり、変数、パラメーター、メソッド戻り値すべてのデータ型が、コンパイル時に確定されます。また、JavaFX Script は宣言型プログラミング言語でもあるため、アプリケーションの作成方法ではなく、アプリケーションの特徴を記述します。画面上でアプリケーションをどのように表示するかを決定するアルゴリズムは、サポート・ソフトウェア (Swing の Java 2D API) に任されます。このような特質を持つことから、JavaFX Script は GUI の作成には最適だと言えます。

サンプル・アプリケーション・コードと、そこで使用される JavaFX Script GUI コンポーネントを理解しやすいように、まずはJavaFX Script 構文の基本をいくつか抜粋して概説します。

変数およびプリミティブ型

JavaFX Script には StringBooleanNumber、そして Integer の 4 つのプリミティブ型があります。表 1 に、この 4 つのプリミティブ型それぞれに対応する Java の型を示します。


表 1. JavaFX Script のプリミティブ型と対応する Java の型
JavaFX Script プリミティブ型対応する Java プリミティブまたはオブジェクト
String java.lang.String
Boolean java.lang.Boolean
Number java.lang.Number
Integer Int, long, byte, short, java.math.BitInteger

上記の型の変数を使用するときは、いずれも var キーワードを指定します。Java 言語とは異なり、JavaFX Script では変数の型をその宣言のなかで指定する必要はありません。インタープリターが、変数の使い方を基に型を推測できるからです。ただし、JavaFX Script は静的に型付けされることから、宣言された変数の型はそのライフサイクル全体を通して変えることができせん。例えば、JavaFX Script で var myString = "Hello"; とある場合、Java コードでは var myString:String = "Hello"; がこれに相当します。

演算子

表 2 と表 3 に、JavaFX Script で使用する演算子と Java での対応する演算子を示します。JavaFX Script で式を作成する際には、この 2 つの表を参照してください。


表 2. JavaFX Script の関係演算子
関係演算子Java の演算子意味
== == 等しい
<> != 等しくない
< < より小さい
> > より大きい
<= <= 以下
>= >= 以上

表 3. JavaFX Script のブール演算子
ブール演算子Java の演算子意味
and && 論理積
or || 論理和
not ! 否定

関数およびオペレーション

JavaFX Script は、function キーワードを使用してプログラムの機能サブセットを表します。JavaFX Scriptでは関数に変数宣言と return 文を含めることが可能で、すべて中括弧で囲まれるため、単純な数学関数やクラスのゲッターおよびセッターに最適です。リスト 1 に、2 つの数値を加算する JavaFX Script 関数の例を示します。


リスト 1. 関数の例
                
function add(a,b) {
   var c = a + b;
   return c;
}

JavaFX Script でのすべてのプロシージャーは operation キーワードで示されます。プロシージャーにはいくつでも文を含めることができます。リスト 2 は、単純なオペレーションの例です。


リスト 2. オペレーションの例
                
operation helloWorld() {
   System.out.println("Hello world.");
}


JavaFX Script のサンプル・アプリケーション

JavaFX Script の基本的な GUI 機能のいくつかを説明するため、簡単な電卓のサンプル・アプリケーションを作成しました。このアプリケーションが持つ機能は、Microsoft® Windows® オペレーティング・システム付属の電卓が持つ機能の一部です。図 1 に、この電卓を示します。


図 1. JavaFX Script による電卓
JavaFX Script calculator

フレームとメニュー

JavaFX Script アプリケーションのディスプレイは、Frame オブジェクトによって表されます。これは最上位レベルのウィンドウで、ここには枠、タイトル、そしてオプションのメニュー・バーがあります。リスト 3 に、この電卓のフレームの宣言を示します。


リスト 3. Frame の宣言
                
Frame {
   menubar: MenuBar {
      ...
   }
   //text displayed in title bar
   title: "Calculator"
   //size of frame
   height: 200
   width: 200
   //begin content layout
   content: GridBagPanel {
      ...
   }
   visible: true
}

JavaFX Script では、オブジェクトの属性はそのオブジェクトの宣言の中で定義されます。したがって、リスト 3 の宣言にある menubartitleheightwidthcontent、そして visible はすべて、Frame オブジェクトの属性です。title 属性には、ウィンドウのタイトル・バーに表示される String 値が含まれます。この値は、Calculator にしてあります (図 1 のウィンドウのタイトルを参照)。height および width 属性はウィンドウのサイズをピクセル単位で定義します。visible は、アプリケーションの起動時にこのフレームを表示するかどうかを決定する Boolean 属性です。

リスト 3 の Frame オブジェクトに宣言されている menubar 属性の値は、MenuBar オブジェクトとなっています。この MenuBar オブジェクトには、電卓ウィンドウの上端に表示されるメニューの名前とその内容を定義する Menu オブジェクトを 1 つ以上含めることができます。このサンプル・アプリケーションでは、Exit 操作のみが含まれる File メニューを宣言しています。このメニューの宣言は、リスト 4 のとおりです。


リスト 4. Menu の宣言
                
menubar: MenuBar {
   menus: Menu {
      text: "File"
      //first item in the menu
      items: MenuItem {
         text: "Exit"
         //on-click operation
         action: operation() {
            //exit the application
            System.exit(0);
         }
      }
   }
}

Menu オブジェクトには text 属性があります。この属性の値は、表示するメニューのタイトルを表す String です (このサンプル・アプリケーションでは File)。さらに、Menu オブジェクトには items という属性も含まれていて、その値は 1 つ以上の MenuItem オブジェクトにすることができます。MenuItem が表すのは、現行のメニューに表示する操作です。text 属性に MenuItem の名前を定義し、action 属性にはメニュー項目の振る舞いを決定するオペレーションを定義します。この電卓アプリケーションのユーザーが File > Exit を選択すると、action 属性に定義されたオペレーションが実行され、アプリケーションが終了するという仕組みです。

レイアウトと枠

もう一度、リスト 3Frame 宣言を見てください。この Frame オブジェクトの属性のなかでおそらく最も重要なのは、content 属性です。この属性の値となるウィジェット・オブジェクトが、タイトルとメニュー・バーの下のウィンドウ内に表示するコンテンツを定義します。つまり、電卓のテキスト・フィールドとボタンは、この content 属性内で作成されるということです。電卓上のボタンを規則正しく並べるため、リスト 5 に示すようにフォーマット設定したパネルを作成しました。


リスト 5. GridBagPanel 宣言
                
content: GridBagPanel {
   border: EmptyBorder {
      ...
   }
   cells: {
      ...
   }
}

JavaFX Script レイアウト・マネージャーは対応する Swing/AWT のレイアウトをカプセル化し、指定されたレイアウト・マネージャーを使って JPanel をインスタンス化します。この JPanel には、JavaFX Script オブジェクトが提供する属性によってコンポーネントが追加されます。表 4 に、JavaFX Script ウィジェットとそれぞれに対応する Swing/AWT レイアウト・マネージャーを示します。


表 4. JavaFX Script のレイアウト
JavaFX Script のウィジェットSwing のレイアウト・マネージャー
Box BoxLayout
BorderPanel BorderLayout
CardPanel CardLayout
FlowPanel FlowLayout
GridBagPanel GridBagLayout
GridPanel GridLayout
GroupPanel GroupLayout
StackPanel Romain Guy の StackLayout

同様に、JavaFX Script のそれぞれの枠も Swing の枠オブジェクトをカプセル化します。JavaFX Script の枠ごとに、Swing の枠構成オプションに対応する属性があります。表 5 に、対応する枠を示します。


表 5. JavaFX Script の枠
JavaFX Script の枠Swing の枠
BevelBorder BevelBorder
EmptyBorder EmptyBorder
LineBorder LineBorder
MatteBorder MatteBorder
SoftBevelBorder SoftBevelBorder
TiltedBorder TiltedBorder

リスト 5 を見るとわかるように、この電卓アプリケーションに使用するのは GridBagPanel です。GridBagPanel はコンポーネントを格子状 (縦と横) に並べますが、コンポーネントが同じサイズであることは要求しません。各 GridBagPanel がセルの格子を維持し、それぞれのコンポーネントは 1 つまたは複数のセルを占めます。GridBagPanel には bordercells という 2 つの属性があります。border 属性が定義するのは、GridBagPanel に表示する枠のタイプ (表 5 のいずれかのオブジェクト) です。この電卓アプリケーションの場合には、EmptyBorder オブジェクトを使用することにしました (リスト 6 を参照)。


リスト 6. EmptyBorder 宣言
                
border: EmptyBorder {
   top: 5
   left: 5
   bottom: 5
   right: 5
}

この空の枠は完全に透明で、border 属性で定義された分だけスペースを占有しますが、描画はしません。EmptyBorder の属性は topleftbottomright です。この 4 つの属性の値は、ディスプレイの上下左右で枠が占めるスペースの幅をピクセル単位で定義します。このサンプル・アプリケーションでは、グリッド・コンポーネントとパネル・ディスプレイの各辺との間の透明枠として 5 ピクセルを確保しています。

一方、GridPanelcells 属性が定義するのは格子の内側のコンポーネントです。この属性の値は GridCell オブジェクトの配列で、それぞれの GridCell オブジェクトがグリッド内の 1 つのコンポーネントを表します。この GridCell 属性によって、オブジェクトの表示方法、そしてパネル内でのオブジェクトの位置が決まります。この電卓アプリケーションには 19 の GridCell オブジェクトがあり、そのうちの 1 つが電卓上端にあるテキスト・フィールド、2 つが Back ボタンと Clear ボタンに対応し、残りの 16 個が図 1 の電卓上に示されている数字と演算の各ボタンに対応します。リスト 7 に、電卓のテキスト・フィールド、Back ボタン、Clear ボタン、そして最初の 2 つの数字にそれぞれ対応する GridCell オブジェクトを示します。


リスト 7. GridCell 宣言
                
cells:
      [ GridCell {
         anchor: WEST
         fill: HORIZONTAL
         //horizontal grid position
         gridx: 0
         //vertical grid position
         gridy: 0
         //column span
         gridwidth: 4
         content: textField
      }, GridCell {
         anchor: WEST
         fill: HORIZONTAL
         gridx: 0
         gridy: 1
         gridwidth: 2
         content: Button {
            text: "Back"
            ...
         }
      }, GridCell {
         anchor: WEST
         fill: HORIZONTAL
         gridx: 2
         gridy: 1
         gridwidth: 2
         content: Button {
            text: "Clear"
            ...         
         }
      }, GridCell {
         anchor: WEST
         fill: HORIZONTAL
         gridx: 0
         gridy: 2
         content: Button {
            text: "7"
            ...
         }
      }, GridCell {
         anchor: WEST
         fill: HORIZONTAL
         gridx: 1
         gridy: 2
         content: Button {
            text: "8"
            ...
         }
      }]

リスト 7 を見るとわかるように、すべての GridCell オブジェクトには共通して anchorfillgridxgridy、そして content という 5 つの属性があります。まず、anchor はコンポーネントが表示域より小さい場合に使用される属性で、表示域のどこにコンポーネントを配置するかを指定します。有効な値は、NORTHSOUTHEASTWESTNORTHWESTNORTHEASTSOUTHWESTSOUTHEASTCENTERです。

コンポーネントの表示域がコンポーネントより大きい場合には、fill 属性も使用されます。この属性は、コンポーネントのサイズを変更することになった場合にその方法を決定します。有効な値は表 6 に示すとおりです。


表 6. GridCell の fill 値
振る舞い
NONE デフォルト値。サイズ変更しません。
HORIZONTAL コンポーネントの幅を表示域の幅に合わせて拡大します。高さは変更しません。
VERTICAL コンポーネントの高さを表示域の高さに合わせて拡大します。幅は変更しません。
BOTH コンポーネントを表示域の高さと幅の両方に合わせて拡大します。

この電卓内のすべてのコンポーネントは表示域の左側 (WEST) に固定され、表示域の幅と同じになるように設定されています。

GridCellgridx および gridy 属性は、グリッド内でのコンポーネントの位置を定義します。この 2 つの属性の値がコンポーネント表示域の左上隅を含むセルを指定します。基準セルの位置は gridx = 0, gridy = 0 です。

リスト 7 に定義された GridCell コンポーネントのうちの 3 つには、gridwidth 属性も含まれています。この属性は、グリッド行内でコンポーネントに占有させるセルの数を指定します。例えば、リスト 7 の最初の GridCell オブジェクト (電卓のテキスト・フィールド) では、gridwidth が 4 に指定されています。これはつまり、テキスト・フィールド・コンポーネントが 4 列にまたがるということです。また、gridxgridy の値はどちらも 0 なので、テキスト・フィールド表示域の左上隅はグリッド域の最初の行と最初の列から始まることになります。

テキスト・フィールドとボタン

リスト 7 で定義された GridCell コンポーネントのそれぞれに、セルの表示域に描画する内容を定義するウィジェット値が含まれています。この電卓アプリケーションのセルに含まれるウィジェットは、テキスト・フィールド・ウィジェットおよびボタン・ウィジェットです。

リスト 7 では content 属性に直接、新しいオブジェクトを定義しています。ここで、JavaFX Script の多様性を紹介する別のシナリオとして、テキスト・フィールドを content 属性の外側で、変数 textField として定義してみます。この宣言はリスト 8 のとおりです。このようにテキスト・フィールドを定義すると、テキスト・フィールドに対応する GridCellcontent属性には、変数名だけをその値として含められるようになります。


リスト 8. TextField 宣言
                
var textField = TextField {
   //indicates default value to appear in text field
   value: "."
   //indicates justification
   horizontalAlignment: TRAILING
   onChange: operation(s:String) {
      //don't change value if user types an invalid character   
   }
};

TextField オブジェクトには 4 つの属性があります。value 属性はテキスト・フィールドに表示するデフォルト値を定義し、horizontalAlignment 属性はテキスト・フィールドのコンテンツの位置調整を指定します。horizontalAlignment 属性に有効な値は、表 7 のとおりです。


表 7. TextField の位置調整値
説明
TRAILING 右寄せを指定します。
LEADING 左寄せを指定します。
CENTER 中央揃えを指定します。

この電卓アプリケーションのテキスト・フィールドには、TRAILING キーワードによって右寄せが指定されています。

テキスト・フィールド・ウィジェットの onChange 属性には、ユーザーがテキスト・フィールドのコンテンツを変更した場合の動作を決定するオペレーションが含まれます。ここでは、電卓アプリケーションによって無効な文字がないかどうかのチェックが行われます。

ボタンの定義方法もテキスト・フィールドの場合とほとんど同様です。ボタンは変数として宣言することも、あるいは親オブジェクトの content 属性に直接定義することもできます。リスト 9 は、Back ボタンの定義です。


リスト 9. Button 宣言
                
content: Button {
text: "Back"
   action: operation() {
      //remove last character entered
   }
}

Button ウィジェットに含まれる属性は textaction の 2 つです。text の値はボタンに表示するテキストを示します。action 属性には、定義したボタンをユーザーがクリックしたときの動作を決定するオペレーションが含まれます。上記の Back ボタンは、リスト 8 に定義されたテキスト・フィールドに入力された最後の文字を削除することになっています。

JavaFX Script の UI には、この電卓の例で使用したウィジェットの他にも、多数のウィジェットを使用できます。この記事で紹介したレイアウトやウィジェット、そしてその他の GUI コンポーネントについての詳細は、「参考文献」に記載したリンクを参照してください。


まとめ

JavaFX Script は極めて動的かつ移植性の高い言語で、Swing で作成するような広範な GUI アプリケーションを、しかも遥かに少ないコードで作成することができます。JavaFX Script は構文の点では Java コードと異なりますが、基礎となる技術はほとんど同じです。JavaFX Script とその機能について詳細を調べて、この記事で得た知識を独自の JavaFX Script アプリケーションの作成にぜひ生かしてください。


参考文献

学ぶために

製品や技術を入手するために

  • JavaFX Script プラグイン: Eclipse および NetBeans 用のプラグインは JavaFX Community から入手できます。

  • JavaFxPad: JavaFxPad で JavaFX Script コードを入力すると、すぐにその結果を調べられます。

議論するために

著者について

Cathy Kegley は、IBM Lotus Expeditor クライアント・チームのソフトウェア・エンジニアです。

Greg Roberts は、IBM Lotus Expeditor クライアント開発チームのスタッフ・ソフトウェア・エンジニアです。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Java technology, Web development
ArticleID=288830
ArticleTitle=JavaFX Script で作るリッチ・アプリケーション
publish-date=01152008
author1-email=ckegley@us.ibm.com
author1-email-cc=jaloi@us.ibm.com
author2-email=gwrobert@us.ibm.com
author2-email-cc=jaloi@us.ibm.com

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。