Sunは携帯端末向けのGUIアプリケーションもターゲットとしているようで、JavaFX Mobileというシステムも提供していくとアナウンスしています。こちらは、従来よりもパワーがある携帯端末で、Java SEが動作するようなものを想定しているようです。
PCのデスクトップだけでなく、この先進的な携帯端末でも動くGUIアプリケーションを簡単に作成できるということが、JavaFX Scriptの売りとなっているようです。昨年から続いているEoDの流れにも沿っているのでしょう。ということで、早速JavaFX Scriptを使ってみました。
■ JavaFX Scriptの使いどころとは?
JavaFX Scriptは、SunのJavaFXのサイトで紹介されています。RIA(Rich Internet Application)を簡単に実装できることが売りですが、Javaプログラマにとっては、既存のスクリプト言語との関係が気になるところです。Swingライブラリを使ったプログラミングの方が、Javaの文法で行える分、気が楽だというのが正直なところなので、こういったスクリプト言語の存在に価値を見いだすとしたらどこか、というのが最初に気になります。
■ Webブラウザの出現でUIデザインの仕方は変わった
一昔前のコンピュータ用アプリケーションの開発においては、ユーザーインターフェイスデザインというのは、開発者が片手間にやっていたり、コンピュータのユーザーインターフェイスに詳しいエンドユーザーが指示をしていたり、というのが普通の世界でした。
しかし、Webブラウザの出現によって、状況は変わってきています。いまや、Webサービスの開発においては、デザインチームが画面デザインをし、Web開発チームがそれをXHTML+CSSやAjaxで実装し、サーバサイドは開発チームがプログラミングをするといった体制で開発が増えてきています。賛否両論はあるようですが、GUIアプリケーションのモデルとして有名なMVCモデルをWebアプリケーション開発に適用していることが多いはずですし、多くのフレームワークは、基本的にこのモデルを採用しています。
■ RIA開発ではより柔軟なGUIコンポーネントが必要
このように、RIAの開発が要求されるようになってきていますが、これまでのようにWebブラウザに依存した技術だけでそれを実現するのは難しくなってき ています。これからは、より柔軟に、より高度なGUIコンポーネントを組み合わせることができて、しかもインターネットに対応したアプリケーションを開発 できる技術が必要なのです。
■ JavaFX Scriptはデザイン側やクライアント開発側で使われる?
こうして見ると、JavaFX Scriptを使うのは、実はサーバサイドで開発をしているJavaプログラマよりは、現在、XHTML+CSSやAjax回りを使っているWeb開発 チームが一番関係してきそうです。このチームのメンバが、Webアプリケーション開発時にJavaScriptやFlashを使っていたのと同じように、デスクトップでも携帯端末でも同じように動作するRIAを開発するに当たって、JavaFX Scriptを使うことになると考えられます。
ですから、JavaFX Scriptを評価するに当たっては、こういった開発体制で利用できそうなのか、JavaScriptやFlashを使うのと同じくらい簡単に使えるの か、といった項目が重要ではないでしょうか。こんなことを考えながら、いくつかの簡単なサンプルコードを作ってみました。
■ ダウンロードして、デモを試す
JavaFX Scriptのオープンソース実装であるOpenJFXのサイトで は、活発に開発がされていて、バージョンアップが頻繁に行われています。アーカイブはzip形式とtar.gz形式が用意されていますので、好きな方をダ ウンロードしてください。ここでは、記事執筆時にダウンロードしたOpenJFX-200705302107.zipを使って動作確認をしていますので、 あらかじめご了承ください。
OpenJFXのサイトでは、ライセンスは将来的にはGPLとなると書いてありますが、記事執筆時にダウンロードしたものには、「Technology Evaluation License」が同梱されていました。
■ Java Web Startを使ったデモ
ところで、このサイトには「Demos」と記載してあるところに、JNLPを使ったJava Web Startで起動するデモも用意されています。ちょっと様子を見てみたいというだけでしたら、このデモをダウンロードして動作させてみるといいでしょう。こういうのを使うと、Java Web Startの良さを実感できるはずです。
図2 JavaFX Script Tesla Demoの画面
■ デスクトップ上でも、デモを動かす
ともあれ、手元でも動作をさせてみましょう。ファイルをダウンロードしたら展開します。ここでは、Windows XPを使って確認をしました。展開した結果できたディレクトリは、C:\OpenJFXという名前に置き換えています。なお、後で作成するサンプルコード 用にC:\OpenJFX\sampleも作成しておきました。
ダウンロードしたファイルに同梱されたjavafxpad.batは簡単なJavaFX Scriptプログラムの開発に使える便利なツールです。前述のJava Web Startのデモにもあります。早速使ってみました。
図3 JavaFxPadの実行例
■ 簡単なJavaFXアプリを作ってみよう!
さて、ここからはWindows Vistaを使って、実際に簡単なサンプルを作ってみます。ダウンロードしたファイルのbinディレクトリには、javafx.batなどの起動スクリプトがあります。文字コードがWindows-31Jのファイルしか使えなくなってしまうので、筆者は次のようなバッチファイルjfx.batを用意して、こちらを使うようにしました。見てのとおり、libディレクトリにあるjavafxrt.jar、Filters.jar、swing-layout.jarを使います。
また、スクリプトの起動には、net.java.javafx.FXShellクラスを使います。ここでは、ファイルのエンコードをUTF-8としています。プログラムを作成するときには、UTF-8で保存するように気を付けてください。なお、javaコマンドへのパスはあらかじめ通しておきます。
jfx.bat |
@echo off |
SimpleSwingSample.java |
import java.awt.event.ActionEvent; |
コンパイルをして実行してみます。javacコマンドへのパスは通しておいてください。ソースファイルの文字コードを指定する必要があるので、「-encoding」オプションを付けている点にも注意してください。
コンパイルしてjavaコマンドを実行 |
>javac -encoding UTF-8 SimpleSwingSample.java |
■ JavaFX Scriptで記述すると?
これを、JavaFX Scriptで記述すると、次のようになります。文法事項については、JavaFX Scriptの言語仕様がまだドラフトであることと、実装も頻繁に更新されていることから、あまりくどくどと説明せずに、重要な点だけを解説することにします。
一目見て分かることは、非常に簡単に記述できるということでしょう。画面を表すのがFrameで、その属性をCSSと同じような感じに指定できるようになっています。Swing版のプログラムと比較してもJavaFX Scriptの方が断然書きやすそうです。また、SwingUtilitiesも、この程度のプログラムなら必要ないようです。
JavaFX Scriptで記述 |
import javafx.ui.*; |
Swingプログラミングでは、Buttonには、addActionListenerメソッドを使って、ActionListenerを登録していましたが、JavaFX Scriptでは、actionという属性にoperation()を指定し、そこでボタンを押されたときの処理を記述します。
ここでは、java.lang.Systemクラスを使って、「OK」という文字列をコンソール画面へ出力していますが、このクラスをimportしていることに注意してください。また、FrameやButtonといったクラスはjavafx.uiパッケージのクラスで、「import javafx.ui.*;」を宣言していないと、エラーとなります。
実行をするには、次のようにします。先ほど作成したバッチファイルを使っています。コンパイルスレッドがイベントディスパッチスレッド上で動作していることがコンソール画面へ表示され、その後に画面が表示されます。
JavaFXアプリケーションを実行 |
>jfx.bat SimpleFxSample.fx |
図5 JavaFX Scriptで作ったサンプルの実行画面
■ JavaのSwingライブラリを意識したコーディングをすると?
JavaのSwingライブラリを意識したコーディングもできます。こちらでも随分コンパクトに書けます。JavaFX Scriptの書き方に慣れないJavaプログラマはこちらの書き方の方が書きやすいかもしれません。javax.swing.JFrameなど、必要なクラスをimportしているので、忘れないようにしてください。
JavaのSwingライブラリを意識したコーディングの例 |
import javax.swing.JFrame; |
図6 JavaのSwingライブラリを意識して作ったサンプルの実行画面
■ スクリプトの起動方法を考える
Javaプログラムとの連携を考えると、どうやってJavaプログラムからJavaFX Scriptプログラムを起動するのかについては確認をしておく必要があります。起動スクリプトから分かりますが、net.java.javafx.FXShellはmainメソッドを持っているので、次のようにmainメソッドを呼ぶのが一番簡単なようです。とはいえ、これはJavaのスクリプティング標準の方法ではありません。
FxRunner .java |
import net.java.javafx.FXShell; |
コンパイル時、実行時にはjavafxrt.jarや、swing-layout.jarファイルにクラスパスを通すことを忘れないようにしましょう。必要であれば、Filters.jarにもクラスパスを通します。
FxRunner .javaの実行結果 |
>javac -classpath ..\lib\javafxrt.jar -encoding UTF-8 FxRunner.java |
■ JSR-223に従うスクリプティングエンジン
Javaスクリプティングを使って、JavaFX Scriptのエンジンを利用する前に、JSR-223に従うスクリプティングエンジンの実装がどれくらい進んでいるのかをチェックしてみましょう。次のプログラムはクラスパスに登録されているスクリプトエンジンについて、簡単な情報と、実装しているインターフェイスの一覧とを表示するプログラムです。javax.scriptパッケージに含まれるScriptEngineManagerクラスやScriptEngineFactoryクラスの簡単な使用例にもなっています。
CheckEngine .java |
import java.util.List; |
これを実行すると、筆者の環境では次のように表示されました。JavaFX Script Engineに関する情報が表示されているのが分かります。なお、Mozilla RhinoはJava SE 6に同梱されているECMAScript Engineです。これを見ると、Mozilla Rhinoは「javax.script.Invocable」や「javax.script.Compilable」といったインターフェイスを実装していますが、OpenJFXではこれらの実装はまだされていないということが分かります。
CheckEngine .javaの実行結果 |
>java -cp ..\lib\javafxrt.jar;..\lib\swing-layout.jar;. CheckEngine |
編集部注:Mozilla Rhinoについての詳細を知りたい読者は、連載第1回の「JavaとJavaScriptの親しい関係」をご参照願います。
■ JavaFX Scriptを実行するプログラム
それでは、スクリプトを起動するプログラムを書いてみましょう。ここでは、引数については考えないで、単純に起動する方法だけ実現してみました。java.io.FileReaderクラスを使っていることから、ファイルのクローズを確実にする必要があるために、記述は長くなっていますが、ポイントはrunScriptメソッド内の処理になります。
ここで先ほどのプログラムで得たJavaFX Scriptingのエンジン名「FX」を使って、「manager.getEngineByName("FX")」のようにScriptEngineの インスタンスを取得しています。後は、これを使って「engine.eval(reader);」としているだけです。
ScriptRunner .java(抜粋)(全ソースはこちら) |
(略) |
もう一点、注意する必要があります。最後の行でSwingUtilitiesクラスのinvokeLaterメソッドを使ってスクリプト実行のメソッドを 呼び出しています。画面を表示するプログラムはイベントディスパッチスレッドから呼び出す必要があるために、このようにしています。
これを実行すると、JavaFX Scriptのファイルを読み込んで実行できるようになります。変数のバインドなどもJSR-223に従った方法で行えます。
■ アニメーションプログラムを作ってみよう
JavaFX Scriptでは、アニメーションプログラムを簡単に作成できるということなので、それについても確認してみました。単純なデジタル時計を作成したのですが、次のようになります。
ここでは、javafx.ui.LabelクラスをextendsしたクラスとしてDigitalClockを用意しています。パッケージも使えるので、fxパッケージとして、ディレクトリfxにファイルを置いています。
■ JavaFX Scriptのtriggerキーワード
JavaFX Scriptではtriggerというキーワードが あり、ある処理が発生したときに一緒に行いたい処理を記述できます。ここでは、DigitalClockの属性cについて代入がされるたびに、Dateク ラスのインスタンスを生成し、テキスト形式にフォーマットしてjavafx.ui.Labelクラスの属性textへ代入しています。
また、コンストラクタが呼ばれたときに属性runningをtrue とし、runningがtrueの間は属性cの値を更新し続けるようにしています。ただし、「c = [1..100] dur 1000 continue if running;」という処理については、サンプルにあった処理なのですが、言語リファレンスのページであるopenjfx: The JavaFX Programming Languageには説明がないので、正確な意味は分かりません。
dur演算子については、デモに含まれるJavaFX Canvas Tutorialに記述があります。durationの 意味で、この場合は1000ミリ秒間に10ミリ秒ごとに1から100の値がcへ代入されます。残りの「continue if running」の部分については、残念ながらそこにも説明がありませんが、動作を見る限りはrunningがtrueの間、この処理を続けることになり ます。
fx\DigitalClock.fx |
package fx; |
■ デジタル時計の起動プログラム
これを使った画面を表示するには、次のようなプログラムを用意します。ほかのクラスと同じように、fx.DigitalClockクラスをインポートして 使っています。このクラスはjavafx.ui.Labelと同じように使えますが、インスタンスを生成すると、同時に動作し始めるので、画面を終了する ときには、停止する必要があります。それが「onClose: operation() { dc.running = false; }」の部分になります。
DigitalClockFrame.fx |
import javafx.ui.*; |
図7 JavaFX Scriptによるデジタル時計の実行画面
実行すると、デジタル時計の画面が表示されて時間を刻むのが分かるはずです。アニメーションをさせたい場合は、DigitalClock.fxの 「trigger on DigitalClock.c = newValue { /* 処理 */ }」にアニメーション用の処理を記述すればいいだけなので、それほど難しくはないはずです。Swingプログラムでは結構意識が必要だったイベントディス パッチスレッドも、それほど意識しなくてもいいようです。
■ デモのアニメーション
同梱されているデモでも、オブジェクトが回転するなどのアニメーションが試せます。
図8 JavaFX Canvas TutorialデモのAnimation(実行環境はWindows XP)
■ RSSフィード表示アプリを作ってみよう
最後に、インターネットアプリケーションのサンプルも作成してみました。RSSフィードを読み込んでツリー形式で表示する単純なものです。JavaFX Scriptだけでは難しいので、RomeというAtom/RSS用のライブラリを使っています。RomeはJDOMを使うので、こちらも必要です。今回は、rome-0.9.jar、rome-fetcher-0.9.jar、jdom.jarを使って実装しています。
ここでは、RssTreeというクラスを用意して、タイトルを保存する配列としてtitlesを用意し、タイトルと対になるURIを保存するマップをuriMapで用意しています。コンストラクタでフィードを読み込んで、RssTreeの初期化をしています。
■ JavaFX Scriptの面白い命令
特長的なのは、while文の中でエントリからタイトルと、それに対応するURIをRssTreeへ保持する処理をしているのですが、配列のtitlesへ「insert title into titles;」という命令で値を追加している点です。配列へは添え字を使って代入するのが普通なのですが、JavaFX Scriptには、こういった面白い命令が用意されているのです。
RssTree.fx(抜粋)(全ソースはこちら) |
(略) |
■ JavaFX Scriptのforeach文
rootのTreeCellへTreeCellを追加するに当たり、foreach文を使って登録しているあたりにも注目してください。こういった処理は癖があるので慣れるまで難しいと思いますが、同じ部品を繰り返し登録するのには便利です。
■ RSSフィード表示アプリの実行結果
実行時にはRomeとJDOMのJARファイルへもクラスパスを通すように気を付けてください。起動に成功すると、@ITのフィードを読み込んで表示します。エラー処理については記述していませんが、このようなプログラムも組めることが分かりました。
図9 JavaFX ScriptによるRSSフィード表示アプリの実行画面
■ JavaFX Scriptを楽しむ
以上、ドキュメントが少ない中、インターネット上で公開されているサンプルと、ダウンロードしたアーカイブに同梱されているデモプログラムを中心にして簡 単なサンプルを作ってみましたが、本格的に使用するには、まだいろいろと苦労しそうですが、面白いプログラミング言語だと思いました。
最後にコンポーネントを組み合わせて表示するプログラム(ソースはこちら)も作成してみましたが、複雑なデザインの画面も結構気軽に作成できそうです。
図10 ComponentTest.fxの実行画面
■ RIAの元祖はJavaアプレットだった
思い起こせば、10年前にJavaアプレットという方法で、RIAを実現する言語としてJavaには注目していましたが、いろいろな経緯を経て、あまり使われなくなってしまいました。最近はJavaのプラグインが必要なサイトはほとんど見掛けません。
Swing も高性能なのですが、なかなかデスクトップサイドのアプリケーションで普及しているものはありません。筆者はかなりJava好きですが、Webブラウザ、 メールクライアント、オフィス製品など、どれもJavaアプリケーションのものは使っていません。しかし、Sunはあきらめていなかったのでしょう。ここ にきて、JavaFX Scriptでこの分野での巻き返しをしようとしているのではないでしょうか。まだまだ実力は未知数ですが、言語としては面白い機能を持っているので、楽 しめることは間違いありません。
■ Java SEと親和性のあるRIA
また、Javaには既存の膨大なライブラリがあり、JavaFX Scriptからは、それらを簡単に使えるという点は大きな魅力です。Java SEのアプリケーションやライブラリと親和性のあるスクリプト言語は、必ず開発に役立つはずです。
ただし、JavaFX Scriptは、高度なアニメーション機能を備えたGUIインターフェイスの開発を容易にすることに重点が置かれていますから、その点だけは忘れないようにした方がいいでしょう。以上の事柄を踏まえて、JavaFX Scriptを新しい開発に生かしていくといいのではないでしょうか。
相关推荐
JavaFX 官方教程:RIA 应用开发
JavaFX是Oracle公司推出的一种用于构建富互联网应用程序(RIA)的平台,它为开发者提供了丰富的图形用户界面(GUI)工具和组件,使得开发者可以创建出具有高质量、高性能、跨平台的应用程序。本教程将深入探讨JavaFX...
Abstract Java game library based on JavaFX. 基于JavaFX的抽象Java游戏库 Abstract Java game library based on JavaFX. 基于JavaFX的抽象Java游戏库 Abstract Java game library based on JavaFX. 基于JavaFX的...
标题 "hotel_javaFx_java_hotel_" 暗示这是一个基于JavaFX技术开发的酒店管理系统的项目。这个系统可能用于处理酒店日常运营中的各种任务,如预订管理、客房管理、客户信息管理等。JavaFX是一个用于构建桌面应用的...
[美] Jim Clarke 等 著;杨明军 译; ISBN:978-7-302-22417-4
JavaFX是一种相对较新的RIA(Rich Internet Applications)技术,由Sun公司推出,并在2007年的JavaOne大会上正式发布。它是在广泛使用的Java编程语言基础上构建的,旨在为PC、移动电话、电视、车载系统以及浏览器等...
JavaFX 是一个用于构建桌面、移动和嵌入式设备上富客户端应用的开源图形用户界面(GUI)工具包。它是Java平台的一部分,提供了一系列高级特性,包括2D和3D图形处理、媒体支持、CSS样式以及强大的数据绑定机制。本...
JavaFX是一种用于构建桌面、移动和嵌入式设备上的富互联网应用程序(Rich Internet Applications, RIA)的Java库。它是Oracle公司推出的,旨在提供一种更简单、更强大的方式来创建具有丰富图形用户界面的应用程序。...
【JavaFX简介】 JavaFX是Oracle公司开发的一个用于构建桌面、移动和云应用的富客户端平台。它提供了丰富的用户界面组件库,支持2D和3D图形,以及媒体播放功能,使得开发者能够创建出具有现代感和交互性的应用程序。...
JavaFX与FFmpeg结合开发的视频剪切工具是一款强大的应用程序,它允许用户对视频进行精细化操作,如指定时间段剪切视频、自动生成字幕并添加语音、以及将多个视频合并成一个新视频。这个工具利用了JavaFX的图形用户...
在本文中,我们将深入探讨如何使用JavaFX和科大讯飞的API实现在线文字转语音功能。这个项目的核心是将用户输入的文字转化为自然流畅的语音输出,为用户提供一种便捷的语音合成工具。以下是对相关知识点的详细说明: ...
JavaFx官方教程:RIA应用开发,希望用得着的小伙伴们下载。
基于javafx、javaSwing、spring boot 开发权限管理系统。
JavaFX PDF阅读软件是一款基于JavaFX技术开发的PDF文档查看应用程序。它利用开源库icepdf来解析和渲染PDF文档,为用户提供一个用户友好的界面来查看和操作PDF文件。下面我们将详细探讨JavaFX、icepdf以及如何使用...
JavaFX是一种强大的图形用户界面(GUI)开发框架,主要用于构建 Rich Internet Applications(RIA),即富互联网应用程序。它是由Oracle公司推出的,旨在提供更高级别的、跨平台的UI工具集,以便开发者可以创建出...
Sun公司已于2008年12月05日发布了JavaFX技术的正式版,它使您能利用 JavaFX 编程语言开发互联网应用程序(RIA)。该产品于2007年5月在JavaOne大会上首次对外公布。JavaFX技术主要应用于创建Rich Internet ...
JavaFX教程;JavaFX教程;JavaFX教程JavaFX教程;
### JavaFX:Java的现代UI革命 #### JavaFX概述 JavaFX是Java生态系统中的一个重要组成部分,专注于提供现代、丰富的用户界面开发解决方案。随着用户对于应用界面的要求越来越高,JavaFX成为了开发高质量、跨平台...
JavaFX SDK 11.0.2 是一个用于开发富客户端应用程序的工具包,它在Java 11及更高版本中不再作为标准JDK的一部分。这个独立的SDK提供了必要的库和工具,使得开发者能够在Java平台上构建具有丰富图形用户界面(GUI)的...
javafx2.0,java,javafx,例子,代码 Sun公司(已于20092008年12月05日发布了JavaFX技术的正式版,它使您能利用 JavaFX 编程语 言开发富互联网应用程序(RIA)。JavaFX Script编程语言(以下称为JavaFX)是Sun微...