ついにベールを脱いだJavaFX

第11回 通信と非同期処理

この記事を読むのに必要な時間:およそ 12 分

では,AtomReaderクラスを使用してサムネイルとタイトルを表示するユーザインターフェースを作成しましょう。

リスト6

// リストで表示する項目
var items: SwingListItem[];
 
var rssReader = AtomReader {
    url: "http://api.flickr.com/services/feeds/photos_public.gne?id=57085156@N00&lang=en-us&format=atom"
    
    onDone: function(infos: PhotoInfo[]) {
        // パースが終了したら,HTMLでリストの項目を表示する
        for (info in infos) {
            var item = SwingListItem {
                text: "<html><p>{info.title}</p><img src='{info.thumbnailUrl}' /></html>"
            }
            insert item into items;
        }
    }
}
rssReader.read();
 
Stage {
    title: "FlickrAtomReader"
    scene: Scene {
        width: 400
        height: 600
        content: [
            // リストをスクロールペインで表示する
            SwingScrollPane {
                width: 400
                height: 600
                
                view: SwingList {
                    items: bind items
                }
            }
        ]
    }
}

ここではjavafx.ext.swing.SwingListクラスを使用して,リストでサムネイルイメージを表示しています。SwingのコンポーネントはHTMLを扱えるため,SwingListItemオブジェクトのtextアトリビュートにタイトルとサムネイルのURLを埋め込んだHTMLを指定しています。

なお,AtomReaderオブジェクトのurlに設定しているのは,筆者のFlickrのAtomです。

実行結果を図3に示します。

ここではAtomを題材にしましたが,同じようすることでRESTful Webサービスも扱うことが可能です。

なお,HttpRequestクラスを扱う上で注意すべき点もあります。HttpRequestクラスはコネクト処理などは別スレッドで行うのですが,読み込みを行うonInput関数はイベントディスパッチスレッドで実行します。

このため,onInput関数に時間のかかる処理を記述してしまうと,ユーザインターフェースの反応速度が悪くなってしまいます。JavaFXでは,イベントディスパッチスレッドを意識することがほとんどないので,逆に気をつけないとだめですね。

このようにHttpRequestクラスは,非同期で行う処理が少ないのが残念なところです。より多くの処理を非同期に行うには,JavaFX Desktopに限定されてしまいますが,SwingのSwingWorkerクラスを使用するのがお勧めです。

実をいうと,SwingListItemクラスにイメージを含んだHTMLを表示させると,パフォーマンスが低下します。そこで,SwingListクラスを扱わずにFlickrAtomReaderを作り変えたFlickrAtomViewerを作成してみました。

FlickrAtomViewerではSwingWorkerクラスを使用して非同期にパース処理やサムネイルイメージのロードを行っています。スクリプトの解説は行いませんが,図4にリンクしているアプレットページにスクリプトのソースも示しました。興味のある方はぜひ参考になさってください。

なお,JavaFXはJava SE 6上で動作しているにもかかわらず,SwingWorkerクラスのようにJava SE 6で導入されたクラスは,コンパイルエラーになってしまいます。これはJavaFXがコンパイル時にJ2SE 1.5相当のクラスライブラリに相当するJARファイルを使用しているためです。これを解消するには,2つの方法があります。

  • rt15.jarを入れ替える
  • profileの設定を変更する

rt15.jarというのがJ2SE 1.5のクラスライブラリに相当するファイルです。このファイルはJavaFX SDKであれば,SDKをインストールしたディレクトリの下のlib/desktopディレクトリに存在します。NetBeansを使用している場合は,ユーザディレクトリに存在する.netbeansディレクトリにある6.5/javafx-sdk1.0/lib/desktopディレクトリにあります。ユーザディレクトリはWindows XPの場合,C:\Documents and Settingsディレクトリ,Windows Vistaの場合C:\Usersになります。

はじめの方法は,このファイルを削除してしまい,代わりにJava SE 6のjre/lib/rt.jarファイルをコピーします。そして,rt.jarファイルをrt15.jarとファイル名を変更します。

後者の方法は,rt15.jarを設定している設定ファイルを編集するという方法です。

JavaFX SDKをインストールしたディレクトにprofilesというディレクトリがあります。そのディレクトリの中にあるdesktop.propertiesファイルが設定ファイルです。NetBeansの場合は,ユーザディレクトリの下の.netbeans/6.5/javafx-sdk1.0/profilesディレクトリにあります。

このファイルの中に以下に示したとおりcompile_bootclasspathが設定してあります。

リスト7

compile_bootclasspath="${javafx_home}/lib/shared/javafxc.jar;${javafx_home}/lib/shared/javafxrt.jar;${javafx_home}/lib/desktop/rt15.jar"

この行の最後の${javafx_home}/lib/desktop/rt15.jarの部分を,Java SE 6のrt.jarに置き換えてしまいます。Windowsであれば,${javafx_home}/lib/desktop/rt15.jarをC:/Program Files/jdk1.6.0_12/jre/lib/rt.jarに置き換えます。

これはJava SE 6u12の場合ですが,お使いのJavaのバージョンに応じてディレクトリは変更してください。

著者プロフィール

櫻庭祐一(さくらばゆういち)

横河電機に勤務するかたわらJava in the Boxにて新しい技術を追い続けています。JavaOneは今年で11年目。名実共にJavaOneフリークと化しています。