読者です 読者をやめる 読者になる 読者になる

JavaFX 1.1 で印刷 Applet/Java Web Start編

昨日、紹介した方法はデスクトップアプリケーションであれば動作しますが、アプレットJava Web Start だと使えません (もちろん、署名すれば使えますけど...)。

そこで、アプレットJava Web Start の場合は JNLP API を使って印刷し、それ以外の場合は機能の方法を使って印刷させるようにしてみました。

ただし、アプレットの場合、JNLP API をサポートしている Java Plug-in は Java SE 6u10 以降なので、それ以降のバージョンをお使いください。

JNLP API の詳細情報に関しては

「Java SE 6完全攻略」番外編 Java SE 6u10の新機能

をご覧ください。印刷に関しては来月開設する予定にしてます。

JNLP API で印刷をするには javax.jnlp.PrintService クラスを使用します。

問題はアプリケーションがどのような形態で実行されているか分からないということです。isApplet みたいなプロパティがあればいいのですが、残念ながらありません。

しかたないので、PrintService クラスとファクトリクラスの ServiceManager クラスがロードされているかどうかで場合分けしました。

本当は例外処理を通常処理の場合分けに使うのはよくないのですが、これしか方法を思いつかなかったので... ^ ^;;

ということで、昨日のスクリプトの PrintableNode クラスの定義を次のように変更するとアプレット/Java Web Start でも印刷ができます。

class PrintableNode extends Group {
    public function print(): Void {
        var printable = FXPrintable {
            comp: this.impl_getSGNode().getPanel()
        }
        try {
            // lookup の戻り値は Object なので、PrintService にキャスト
            var service = ServiceManager.lookup("javax.jnlp.PrintService")
                                    as PrintService;
            service.print(printable);
            return;
        } catch (exception: ClassNotFoundException) {
            // ServiceManager をロードできない
        } catch (exception: UnavailableServiceException) {
            // 印刷サービスを使えない
        }
        var job = PrinterJob.getPrinterJob();
        job.setPrintable(printable);
        job.printDialog();
    }
};

コンパイルには JNLP API を含んだ javaws.jar ファイルが必要です。javaws.jar は [JREをインストールしたディレクトリ]/lib/ にあります。たとえば、JDK を C:\Program Files\Java\jdk1.6.0_13 にインストールしたとすると、C:\Program Files\Java\jdk1.6.0_13\jre\lib\javaws.jar です。

アプレット/Java Web Start で実行して [Print] ボタンをクリックすると、以下のような警告ダイアログが表示されます。[了解] ボタンをクリックすると、印刷のダイアログが表示され、印刷することができます。

f:id:skrb:20090521144556j:image