Sun Java Solaris Communities My SDN Account
 
次世代 Java™ Plug-In テクノロジのリリースノート

JDK 6u10

                                Java SE 6u10 アップデートリリースノート JDK Documentation

目次

はじめに

Java Runtime Environment の一部である Java Plug-In テクノロジ (以下、「Java Plug-In」) を使用すると、Java アプレットをデスクトップ上の一般的な Web ブラウザで実行できます。Java SE 6 Update 10 で新たに導入された次世代の Java Plug-In は、下位互換性を保ちつつアプレットの全体的な信頼性と機能性を向上させるとともに、Web ブラウザ内で動作するアプレットに強力な新機能を提供します。

次世代 Java Plug-In では、アーキテクチャーが完全に再設計されました。新しいプラグインでは、アプレットを Web ブラウザと同じオペレーティングシステムプロセス内で実行する代わりに、1 つ以上の Java 仮想マシンインスタンス (JVM) を実行し、そこからブラウザに再び接続することで周囲の Web ページとの完全な相互運用性を実現します。このアーキテクチャー変更には数多くの利点があり、いくつもの新機能の実装が可能になりました。

  • 信頼性の向上。 アプレットを実行中の JVM は、オペレーティングシステムレベルで Web ブラウザから隔離されています。アプレットの実行中に不具合が生じたり、非協調的なアプレットが停止を拒否する場合、新しい Java Plug-In がエラー条件を検出して適切な方法で処理するため、Web ブラウザは影響を受けません。
  • 組み込み JNLP のサポート。 新しいプラグインは JNLP ファイルからアプレットを直接起動する機能を備えているため (Java Web Start を使用)、Java コンテンツの配備をブラウザの内部と外部で一元管理することが可能になります。開発者は、JavaFX 実行時ライブラリOpenGL を使用した 3D グラフィックス、アプレット内部での惑星規模の地形視覚化など、JNLP 拡張機能を再利用することで高度な機能を実現できるようになりました。アプレットは、サンドボックス化されたコードから、持続的データ記憶領域、ローカルファイルシステムアクセスなどの便利な機能に対応した JNLP API にアクセスできます。
  • アプレットごとのコマンド行引数。 JVM コマンド行引数をアプレットごとに指定できるため、ヒープサイズや Java 2D ハードウェアアクセラレーション機能などのオプションをきめ細かく制御できます。JNLP を使って起動するアプレットの場合は、コマンド行引数またはシステムプロパティー、あるいはその両方を JNLP ファイル内に組み込むだけです。従来のスタイルのアプレットの場合は、これらの引数を Web ページの HTML に埋め込むことができます。
  • 複数の JRE バージョンのサポート。 アプレットのインスタンスごとに、動作する JRE バージョンを要求できます。この機能は、アプレットの実行を特定の JRE バージョンまたは特定の JRE ファミリに限定することを望む企業の顧客のために設計されました。新しいプラグインでは、JRE の特定バージョンの選択、および特定ファミリの選択がどちらもサポートされます。
  • Java/JavaScript 通信の改善。 Web ブラウザ内の JavaScript エンジンと Java プログラミング言語間のブリッジが、完全に再実装されました。新しい実装は、下位互換性の維持に加え、Java による JavaScript の呼び出しと JavaScript による Java の呼び出しの両面での信頼性、パフォーマンス、およびブラウザ間相互の移植性向上を特徴としています。静的 Java メソッドの呼び出し、新しい Java オブジェクトのインスタンス化、および Sun 以外のパッケージの JavaScript からの読み出しなど、以前の Mozilla 固有の「LiveConnect」機能がすべてのブラウザで利用可能になりました。
  • ユーザー経験の向上。 新しい Java Plug-In はアプレットをバックグラウンドで起動するため、Web ブラウザは常に応答可能な状態にあります。アプレットは、実行可能な状態になると Web ページに表示されます。
  • アプレットライフサイクル管理の改善。 アプレットライフサイクルメソッド initstartstop、および destroy の呼び出しの確定性が向上したため、ブラウザ間共通の動作が改善されました。下位互換性の維持に必要なアプレットのクラスローダキャッシュおよび従来のアプレットライフサイクルが完全にサポートされるとともに、双方の動作が改善されました。
  • 大規模なヒープのサポート。 これまでは、Java コントロールパネルでアプレットに指定可能な最大ヒープサイズは制限されていました。新しい Java Plug-In ではこの制限が修正され、コマンド行アプリケーションと同量のヒープサイズを使用できるようになりました。
  • Windows Vista サポートの改善。 Microsoft Windows Vista の保護モード Internet Explorer 上で動作する署名付きアプレットが、通常のユーザーアプリケーションと同じ特権を持つようになったため、このプラットフォームへの移植上の障害が取り除かれました。

新しいプラグインは、長期間修正されずにいたいくつかのバグをすぐに修正します。次に示すバグはその一部です。

6359309 -Xmx パラメータが大きな数値に設定されていると、Internet Explorer でプラグインが起動しない
6433218 Java ランタイムパラメータ設定が大きな数値に設定されていると、Java アプレットが失敗する
6504236 Vista 上でファイル入出力の IE Broker プロセスが実行される
6516270 IE7 で Java アプレットを実行すると、「複数の Java 仮想マシンが稼動中です」というエラーを表示して失敗する
6528750 ランタイムパラメータ値が大きな数値に設定されていると、JRE が失敗する
6548078 Windows Vista 上で保護モードの IE7 を実行すると、Java セキュリティーモデルが破壊される
6559586 このアプレットサイトが原因で IE がフリーズする

サポートされるプラットフォームとブラウザ

新しい Java Plug-In は、次のブラウザで動作するように設計されています。

  • Windows XP および Vista 上で実行される Internet Explorer 6 および 7
  • Windows XP、Windows Vista、Solaris、および Linux 上で実行される Firefox 3

ほかのブラウザは特にサポートされませんが、サポートされるいずれかのプラットフォーム上で動作し、NPAPI および NPRuntime インタフェースの最新バージョンをサポートするブラウザでは、新しい Firefox 用 Java Plug-In (Windows 上の npjp2.dll および UNIX プラットフォーム上の libnpjp2.so) が正常に動作するはずです。Cookie アクセス、ブラウザのプロキシ設定へのアクセス、ブラウザの認証結果へのアクセスなど、一部の機能が現時点では正常に機能しない可能性があります。

新しい Java Plug-In は Firefox 2 では動作しません。 Windows プラットフォームの場合、Java コントロールパネルを使って新しい Java Plug-In を有効にすると、Firefox 2 の起動時には従来のプラグインが使用され、Firefox 3 の起動時には新しいプラグインが使用されます。 Sun Microsystems と Mozilla Foundation は、Firefox 3 で新しい Java Plug-In をサポートするため、緊密な関係を保ちつつ作業を進めてきました。両組織は共通して、必要な (重大な) 変更を Firefox 2 にバックポートしないことを決定しています。これは、大半の Firefox ユーザーが Firefox 3 にアップグレードすることが見込まれるためです。

インストール

Windows プラットフォーム

Windows プラットフォームの場合、JRE のインストール時に、Internet Explorer および Firefox 3 Web ブラウザで実行中のアプレットに対して新しいプラグインが自動的に有効になります。ユーザーが操作を実行する必要はありません。

当面の間、従来のプラグインと新しいプラグインの両方が並行して提供されます。下位互換性維持のための代替手段を提供するため、Java コントロールパネル内に、どちらのプラグインをアプレットの実行に使用するかを指定するスイッチが含められます。切り替えを実行するには、Java コントロールパネルを実行して「詳細」タブを表示し、「Java Plug-in」ノードで「次世代の Java Plug-in を有効にする」チェックボックスのオン/オフを切り替えます。

Unix プラットフォーム (Solaris および Linux)

.../jre/lib/{i386,sparc}/libnpjp2.so へのシンボリックリンクを、Firefox 3 の firefox/plugins ディレクトリまたは ~/.mozilla/plugins ディレクトリに配置します。リンクの切れた libjavaplugin_oji.so ライブラリへの既存のシンボリックリンクをすべて削除します。

従来の Java Plug-In の使用に戻すには、libnpjp2.so へのシンボリックリンクを削除して、同じ JRE から libjavaplugin_oji.so へのシンボリックリンクを再インストールします。

<applet><object> および <embed> タグの新しいパラメータ

新しい Java Plug-In の新機能の多くは、既存の <applet><object>、および <embed> タグの新しいパラメータとして公開されています。

一般に、Java SE 6 Update 10 で新たに追加された配備ツールキットを使用して、アプレットタグの HTML を自動的に生成することをお勧めします。配備アドバイスガイドに、配備ツールキットを使用してアプレットを簡単かつ移植性の高い方法で配備する方法が示されています。

次に示すパラメータはすべて、配備ツールキットの JavaScript ライブラリの runApplet メソッドに渡される parameters 配列内で簡単に指定できます。または、入れ子の PARAM タグ、または類似の EMBED タグ用構文を使用して、これらのパラメータを既存のアプレットに手作業で追加できます。詳細は、「Java Plug-In Guide」の「Using APPLET, OBJECT and EMBED tags」セクションを参照してください。理解を容易にするために、次に示す例では <applet> および <param> タグのみを使用しています。

次に示すパラメータはすべて省略可能であり、指定しない場合はデフォルト値が使用されます。

JNLP のサポート

次世代 Java Plug-In のもっとも重要な新機能は、JNLP ファイルからアプレットを起動する機能が組み込みでサポートされたことです。JNLP ファイル形式をアプレット記述子として使用することにより、Java Web Start アプリケーション用に記述された以前の JNLP 拡張機能をアプレットでただちに再利用できるとともに、ほかにもさまざまな方法でアプレットの機能が大幅に拡張されます。

jnlp_href

新しい Java Plug-In がアプレットの起動に使用する JNLP を指定します。このパラメータの詳細は、「新しい Java Plug-In テクノロジでの JNLP サポート」を参照してください。

ロード画面

新しいプラグインでは、アプレットのロード前に表示されるイメージのカスタマイズ機能が向上しています。image パラメータのターゲットとしてアニメーション GIF がサポートされました。詳細は、「Java Plug-In Developers' Guide」の「Special Attributes」を参照してください。また、次のパラメータも新たにサポートされました。

boxborder

アプレットがロードされるまでアプレット領域にイメージを表示する間、その周囲に 1 ピクセル幅の境界線を描画するかどうかを示す boolean 型パラメータ。デフォルトは true です。特に、イメージのロード中にアニメーション GIF を使用する場合は、ちらつきが発生しないよう、この値を false に設定することをお勧めします。

centerimage

ロード中のイメージを、左上隅を起点としてではなく、アプレット領域中央に表示するかどうかを示す boolean 型パラメータ。デフォルトは false です。

boxborder および centerimage パラメータの使用例:

   <APPLET archive="large_archive.jar"
           code="MyApplet"
           width="300" height="300">
      <!-- Use an animated GIF as an indeterminate progress bar
           while the applet is loading -->
      <PARAM NAME="image" VALUE="animated_gif.gif">
      <!-- Turn off the box border for better blending with the
           surrounding web page -->
      <PARAM NAME="boxborder" VALUE="false">

      <!-- Center the image in the applet's area -->
      <PARAM NAME="centerimage" VALUE="true">
   </APPLET>

コマンド行引数と JRE バージョンの選択

ここで説明する java_arguments および java_version パラメータは、基本的にどちらも暫定的な手段です。この機能にアクセスするための推奨される方法は、新しい Java Plug-In で JNLP のサポートを使用する方法です。JNLP を使用して起動したアプレットでのコマンド行引数の指定に関する説明を参照してください。

java_arguments

このアプレットインスタンスの実行時に使用する JVM コマンド行引数を指定します。

  1. デフォルトを超える最大ヒープサイズを指定します。
    <APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300">
        <PARAM name="java_arguments" value="-Xmx128m">
    </APPLET>
    
  2. デフォルトでないヒープサイズおよび Java 2D ハードウェアアクセラレーションオプションを指定します。通常、これは OpenGLJOGL を介して使用するアプレットで使用します。
    <APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300">
        <PARAM name="java_arguments" value="-Xmx256m -Dsun.java2d.noddraw=true">
    </APPLET>
    
  3. Java プログラミング言語の宣言機能を有効にします。
    <APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300">
        <PARAM name="java_arguments" value="-ea:MyApplet">
    </APPLET>
    
詳細な説明

「セキュリティー保護された」 JVM コマンド行引数およびシステムプロパティーのセットは、「Java Web Start Developers' Guide」の「JNLP File Syntax」セクションで定義されています。java_arguments パラメータを使用して指定されたすべてのコマンド行引数は、このセキュリティー保護されたセットに由来する必要があります。

アプレットごとの JVM コマンド行引数の処理 (Java コントロールパネルで指定された引数とのやり取りを含む) に関する詳細は、JNLP を使用して起動したアプレットのコマンド行引数に関する節を参照してください。java_arguments パラメータと JNLP を使用して起動したアプレットのコマンド行引数は、同じ基盤メカニズムを使用して構築されているため、同じように処理できます。

java_version

特定のアプレットを起動する JRE バージョンを指定します。

  1. 特定のアプレットで使用する JRE バージョンを指定する
    <APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300">
        <PARAM name="java_version" value="1.5.0_09">
    </APPLET>
    
  2. 特定のアプレットで使用する、特定ファミリ内の任意の JRE を要求する
    <APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300">
        <PARAM name="java_version" value="1.5*">
    </APPLET>
    

詳細な説明

次世代 Java Plug-In でのバージョン選択サポートおよび関連する下位互換性機構については、別個のドキュメント「次世代 Java Plug-In での JRE のバージョン選択」を参照してください。

separate_jvm

特定のアプレットを独自の JVM インスタンス内で実行するよう指示する boolean 型パラメータ。これがサポートするのは、同じ JVM 内で実行中で、かつヒープ空間などのリソースを消費する可能性のあるほかのアプレットからの干渉を許容できない特定の強力なデスクトップアプレットです。

<APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300">
    <PARAM name="java_arguments" value="...">
    <PARAM name="separate_jvm" value="true">
</APPLET>

クラスローダーのキャッシュ

classloader_cache

通常は、2 つのアプレットが同じ codebase および archive パラメータを保持する場合、これらは同じクラスローダーインスタンスによりロードされます。この動作は下位互換性を維持するために必要であり、実在するいくつかのアプリケーションはこれを前提に動作しています。これにより、同一の Web ページ上にある複数のアプレットが Java 言語レベルで互いの静的変数にアクセスすることが可能になります。また、複数のアプレットを、それらが単一のアプリケーションを構成しているかのように効率的に書き込むこともできます。

この機能には、ある種のアプリケーションを書き込むことができる便利な面がある一方で、いくつかの欠点もあります。これは、特に、1 つのアプレットの複数のインスタンスがアクティブである場合に、アプレットの終了に干渉します。また、アプレットのプログラミングモデルがより複雑になります。これは、アプレットの静的フィールドを再初期化する場合、および 1 つのアプレットの実行間でこれらの静的フィールドが維持される場合に、この機能の指定にあいまいさが残るためです。これにより、特定の要求を開始したアプレットを正確に識別できないために、Java Plug-In 内部で特定のユーザーインタフェースの動作が不正確になります。

こうした理由で、新しいプラグインは、クラスローダーキャッシュの使用に基づいて最適化をアプレット単位で実行する方法を提供します。

<APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300">
    <PARAM name="classloader_cache" value="false">
</APPLET>

classloader_cache パラメータのデフォルト値は true です。クラスローダーキャッシュはデフォルトで有効です。

Java コントロールパネルの変更

アプレットのランタイム設定

Java コントロールパネルは、Java Plug-In の新機能をサポートするように拡張されました。特に注目すべきなのは、アプレットの実行に使用する複数の JRE バージョンを管理する機能に対応したことです。グローバルなアプレット設定を変更するための「Java アプレットのランタイム設定」ダイアログボックスは、Java Web Start で使用する「Java アプリケーションのランタイム設定」ダイアログボックスと同じ制御レベルを提供するようになりました。

ユーザーが、JRE を明示的にリストに追加したり、リストから削除したりできるようになりました。Windows プラットフォームでは、インストールされたすべての JRE がリストに自動的に含められます。「検索」ボタンを使用すると、ローカルディスクに解凍されただけでインストールされていない、追加の JRE をすばやく構成できます。特定バージョンの JRE 上で実行する特定アプレットの要求について考慮する際、「有効」チェックボックスを使って、どの JRE を新しい Java Plug-In が使用するかを制御できます。

これまでと同様、「Java ランタイムパラメータ」フィールドを使って、特定の JRE バージョンで実行するアプレットすべてに適用されるコマンド行引数を指定できます。ただし、これからは Java Plug-In の新機能を使用して、グローバルではなくアプレットごとにコマンド行引数を指定することをお勧めします。とはいえ、Java コントロールパネルを使用することでもっとも効率的に指定できる数種類のコマンド行引数が存在します。開発によく使用される -Xdebug はその一例です。

新しいプラグインと従来のプラグインの切り替え

互換性を維持するため、新しい Java Plug-In と従来の Java Plug-In がともに提供されています。コンテンツが新しい Java Plug-In で適切に動作しない場合は、従来のプラグインの使用に切り替えることができます。

Windows プラットフォームのみ、この設定を Java コントロールパネルで行えます。「詳細」タブの「Java Plug-In」ノード内にあるチェックボックスを使って、従来のプラグインと新しいプラグインを切り替えることができます。 この設定を変更したあとで、変更を有効にするために Web ブラウザを再起動する必要があります。

Linux および Solaris プラットフォームの場合は、libnpjp2.so へのシンボリックリンクを従来のプラグイン libjavaplugin_oji.so へのシンボリックリンクに置き換えます。現在のところ、これは手作業で行う必要があります。

従来の Java Plug-In で正しく動作するが、新しい Java Plug-In では正しく動作しないアプレットコンテンツを見つけた場合は、この非互換性の問題を Java Plug-In forum に報告してください。

クロスドメイン XML サポート

通常、未署名の Java アプレットまたはアプリケーションは、それを起動した Web サーバーにしか接続できません。この制限のため、インターネット上の任意のマシンに対して急速に接続を行うサービス拒否攻撃がアプレットから発生することはありません。

Java SE 6 update 10 では、Java Web Start と Java Plug-In の 2 つのテクノロジによって、未署名コードによるインターネット上の Web サービスへのアクセス方法を指定するクロスドメインポリシーファイルの予備的なサポートが行われます。crossdomain.xml ポリシーファイルは、特定のサーバー上にホストされ、選択されたクライアントまたは任意の場所のクライアントに対してそのサーバーへの接続を許可します。クロスドメインポリシーファイルは、特に未署名のアプレットから Web サービスへのアクセスを大幅に簡略化します。

クロスドメインポリシーファイルに関する一般的なドキュメントは次の場所にあります。

Java Web Start と Java Plug-In には、現時点ではクロスドメインポリシーファイル機能のサブセットだけが実装されています。具体的には、サイトアクセス制限がサポートされていません。特定のサーバーへのアクセスが許可されるのは、crossdomain.xml ファイルが存在し、その中に次のようにすべてのドメインからのアクセスを許可するエントリのみが含まれる場合に限られます。

    <cross-domain-policy>
        <allow-access-from domain="*" />
    </cross-domain-policy>
crossdomain.xml ポリシーファイルを公開する Web サービスにアクセスする未署名アプレットの例については、この記事を参照してください。

ポリシーファイルの代替場所

デフォルトでは、アプレットがホスト www.server.com に接続しようとした場合、システムは http://www.server.com/crossdomain.xml にあるクロスドメインポリシーファイルを検索します。しかし、Web サービスの中には別の場所でクロスドメインポリシーファイルを公開するものがあります。

アプレットまたはアプリケーションは、jnlp.altCrossDomainXMLFiles システムプロパティーを使用して 1 つ以上のポリシーファイルの代替場所を指定できます。このプロパティーは、ポリシーファイルをロードできる URL のコンマ区切り形式のリストを取ります。たとえば、次のように指定します。

-Djnlp.altCrossDomainXMLFiles=http://photos.googleapis.com/data/crossdomain.xml,http://foo.bar.com/baz/crossdomain.xml
altCrossDomainXMLFiles のリストに名前が指定されたサーバーに接続しようとすると、そのサーバー上のポリシーファイルの代替場所が (あれば) デフォルトの場所の次にチェックされます。

簡略化された Common DOM のサポート

Java SE 1.4 以降、アプレットの開発者は Common DOM API を使用して、作成中のアプレットを含むドキュメントの文書オブジェクトモデル (DOM) をたどることが可能になりました。Common DOM の実装は、新しい Java Plug-In で書き換えられ、簡略化されたことにより、堅牢性が高まり、使いやすくなりました。

もっとも重要なのは、Document オブジェクトを取得するためのブートストラップメカニズムが簡略化されたことです。次のように、スレッドから呼び出すことができるエントリポイントが 1 つになりました。

    package com.sun.java.browser.plugin2;
    
    public class DOM {
        public static final org.w3c.dom.Document getDocument(Applet applet)
            throws org.w3c.dom.DOMException;
    }

アプレットはこのメソッドを次のようにして呼び出すことができます。

    org.w3c.dom.Document document =
        com.sun.java.browser.plugin2.DOM.getDocument(this);
この API を直接参照する場合は、コンパイル時クラスパスに plugin.jar を追加する必要があります。ただし、新しい Java Plug-In は実行時に使用できない可能性があるため、このメソッドの呼び出しは慎重に行なってください。
    org.w3c.dom.Document document = null;
    try {
        Class c = Class.forName("com.sun.java.browser.plugin2.DOM");
        Method m = c.getMethod("getDocument",
                               new Class[] { java.applet.Applet.class });
        document = (org.w3c.dom.Document)
            m.invoke(null, new Object[] { this });
    } catch (Exception e) {
        e.printStackTrace();
    }
    if (document != null) {
        // ... Manipulate the document ...
    }
うまくいかない場合は、com.sun.java.browser.plugin.dom パッケージに含まれる従来のブートストラップ API に戻ることもできます。

Document オブジェクトを取得したら、HTMLDocument にキャストし、通常は org.w3c.dom 名前空間内のいずれかの API を使用します。

Document およびその他の API の実装は、スレッドに対して安全です。複数のスレッドによるドキュメントへの変更は、不特定の順序で実行されます。複数のアプレットがドキュメントの同じ部分を同時に変更しようとする場合は、やはり注意が必要であり、適切な同期を行う必要があります。

簡単なテストアプレットを次に示します。このアプレットは、そのアプレットを含むドキュメントの DOM に再帰的に下降し、各 HTML タグとその属性を Java コンソールに出力します。特定のノードで属性を照会したときにどの属性が返されるかは厳密に指定されないため、ブラウザによって出力がやや異なります。DOM を変更するアプレットのほとんどは、使用可能なすべての属性を照会するのではなく、ノードの特定の属性を検索して操作する可能性が高いため、これらの出力の違いによる影響を受けないと考えられます。

詳細は、次を参照してください。

新しい LiveConnect の仕様

これまで非公式に LiveConnect と呼ばれていた、Java と JavaScript プログラミング言語間のブリッジが再実装されました。新しい実装は、下位互換性の維持に加え、Java による JavaScript の呼び出しと JavaScript による Java の呼び出しの両面での信頼性、パフォーマンス、およびブラウザ間相互の移植性向上を特徴としています。静的 Java メソッドの呼び出し、新規 Java オブジェクトのインスタンス化、および Sun 以外のパッケージの JavaScript からの読み出しなど、以前の Mozilla 固有の LiveConnect 機能がすべてのブラウザで利用可能になりました。

新しい LiveConnect の仕様では、新しい Java Plug-In の Java/JavaScript ブリッジの動作を記述し、Java Plug-In の代替実装が Java/JavaScript 混在コードの移植性をサポートするためにどのように動作すべきかを規定しています。

実験的機能

Java SE 6 Update 10 で、Sun Microsystems, Inc. はインターネット上でアプリケーションを配備するための新しいパラダイムを導入します。これは、実行中のアプレットを Web ブラウザからドラッグして取り出し、デスクトップ上で実行されるアプリケーションに動的に変換する機能です。このアプリケーションは、標準の JNLP および Java Web Start テクノロジを使用して、デスクトップのショートカットや起動メニュー項目から起動し直すことができます。これは Java プラットフォーム独自の機能で、Web ブラウザ内とデスクトップ上の開発と配備が完全に統一されたことを示します。

この機能は、現時点では実験的なものとされており、今後のリリースで変更または削除される可能性があります。その点にご注意いただき、この機能に関するコメント、提案、その他のフィードバックを、特に Java Plug-In forum 経由で Sun までお寄せください。

個々のアプレットを Web ブラウザからドラッグして取り出せるようにするには、<applet> タグに次のパラメータを追加します。

<param name="draggable" value="true">

デフォルトでは、アプレットを Web ブラウザからドラッグして取り出すジェスチャーは Alt + 左クリック + ドラッグです。一部のプラットフォーム (特に X11) では、通常、ウィンドウマネージャーがこの特定のジェスチャーを横取りし、ウィンドウ全体をデスクトップ上で移動します。ドラッグ操作を開始するジェスチャーの詳細をカスタマイズするには、アプレットクラスに public な isAppletDragStart メソッドを指定します。

public boolean isAppletDragStart(MouseEvent e);

このメソッドは、アプレットまたはそのサブコンポーネントのいずれかの上で発生する、対象となるそれぞれの MouseEvent に対して呼び出されます。アプレットがこのメソッドから最初に true を返したときに、Java Plug-In はドラッグ操作を開始し、アプレットにマウスポインタを追跡させます。現時点では暗黙的に、マウスボタン 1 を含むマウスを離すイベントによってドラッグ操作が終了するものと見なされ、アプレットをデスクトップ上に配置します。

アプレットをデスクトップ上にドロップしたあとも、ドラッグジェスチャーを使用してアプレットを画面上で移動できます。 画面上の移動操作が繰り返されると、isAppletDragStart メソッドが引き続き呼び出されます。次に説明する通知メソッドを使用して、アプレットをデスクトップ上にドロップする前後の動作を必要に応じて変更できます。

ドラッグ操作が始まると、アプレットは Web ページ内の元の親コンテナから削除され、新しい未装飾のトップレベルウィンドウに配置されます。java.applet.Applet をサブクラス化するアプレットには Frame が使用され、javax.swing.JApplet をサブクラス化するアプレットには JFrame が使用されます。

アプレットが次のメソッドを提供する場合を考えます。

public void appletDragStarted();
このメソッドは次の場合に呼び出されます。
  • アプレットが元の親から削除された
  • アプレットが新しい未装飾のトップレベル Frame または JFrame に配置された
  • 新しい Frame または JFrame がまだ可視になっていない
これによって、フレームの装飾の状態を変更したり、フレームを半透明にする 6u10 での実験的機能を使用したり (形成された「ウィジェット」の構築に便利)、その他の操作を実行したりできます。アプレットが次のメソッドを提供する場合を考えます。
public void appletDragFinished();
このメソッドはアプレットがデスクトップ上にドロップされたときに 1 度だけ呼び出されます。

デフォルトでは、アプレットの領域の右上に小さい「閉じる」フローティングボタンが描画され、画面上を移動するアプレットを追跡します。このユーザーインタフェースはカスタマイズできます。アプレットが次のメソッドを定義する場合を考えます。

public void setAppletCloseListener(ActionListener l);
アプレットはその領域内に独自の閉じるボタンを描画するものとみなされます。この場合、Java Plug-In が前述のメソッドを呼び出したときに渡される ActionListener オブジェクトを保存し、その actionPerformed メソッドを呼び出すことにより、ユーザーの入力に応じてアプレットの停止を開始するようにしてください。 actionPerformed メソッドに対する ActionEvent 引数は null である可能性があり、無視されます。

アプレットを含む元の Web ページがまだ可視である間にユーザーが閉じるボタンをクリックした場合、アプレットはページ上の元の位置に配置され、次のメソッドが呼び出されます。

public void appletRestored();
アプレットがブラウザから切断された場合は (下記参照)、通常のアプレット停止が開始されます。stop および destroy メソッドが呼び出されます。

ユーザーが Web ページからアプレットをドラッグして取り出してから、その Web ページ以外の場所へ移動したり、Web ブラウザを終了させたりした場合は、アプレットは Web ブラウザから概念的に「切断」されます。つまり、Java/JavaScript 通信など、一部のサービスが無効になります。 AppletContext.showDocument() の実装など、その他のブラウザサービスは、それほどきめ細かく制御できない別の実装に置き換えられます。具体的は違いは次のとおりです。

  • Java から JavaScript を netscape.javascript.JSObject クラス経由で呼び出そうとすると、JSException が発生します。
  • AppletContext.showDocument を呼び出すと、新しいブラウザのウィンドウが開きます。showDocument(URL url, String target) への呼び出しが実行されると、ターゲットは無視されます。
  • AppletContext.showStatus を呼び出すと、ブラウザのステータスバーではなく Java コンソール (開いていれば) に文字列が表示されます。
  • プロキシ設定とクッキーの照会は、通常は Web ブラウザへリダイレクトされますが、プラットフォーム固有の設定によって処理されます。たとえば、Windows プラットフォームでは、Internet Explorer のプロキシ設定が暗黙的にシステム全体のプロキシ設定となっているため、最初のアプレットの起動に Firefox が使用された場合でも、切断されたアプレットには Internet Explorer の設定が使用されます。
以上の相違点を除いて、切断されたアプレットは通常のアプレットとまったく同じように動作します。セキュリティーモデルに変更はなく、未署名のアプレットはセキュリティーサンドボックス内で引き続き実行されます。実際、切断されたアプレットは基本的に Java Web Start アプリケーションとまったく同じように動作します。

新しい Java Plug-In での JNLP サポートとドラッグ可能なアプレット機能を組み合わせてアプレットを記述すると、大幅な統合が実現します。この場合、アプレットはブラウザから切断されたときに Java Web Start のアプリケーションとして正確に変換されます。新しい jnlp_href アプレットパラメータが使用され、デスクトップショートカットまたはスタートメニューオプションの追加を要求するために JNLP ファイルに shortcut タグが追加された場合は、アプレットが Web ブラウザから切断されたときに (Java コントロールパネルの設定によって異なりますが、通常はユーザーがダイアログボックスを確認したあとで) ショートカットが作成されます。 ショートカットをダブルクリックすると、アプレットを起動し直すことができます。つまり、アプレットをブラウザから取り出してドラッグする操作をアプリケーションのインストール手順として使用できます。

デスクトップショートカットからアプレットを起動し直したときも、アプレットをブラウザからドラッグして取り出したときと同じ条件下で appletDragStarted および appletDragFinished メソッドが呼び出されるため、設定コードは 1 度だけ記述すればよく、ショートカットから起動し直した場合もそのコードが正常に動作します。

注: ショートカットを作成するには、アプレットの JNLP ファイル内の jnlp タグに絶対コードベースを使用する必要があります。残念ながらこれは、コードベースを指定せずに Web ブラウザからピックアップできるようにするという、新しい Java Plug-In で配備を行うためのベストプラクティスのアドバイスに従っていません。今後のビルドでは、この動作を改善したいと考えています。 また、ショートカットから起動し直すときはブラウザを使用してアプレットのサイズを計測できないため、デスクトップショートカットがアプレットのサイズを正確に計測できるように、JNLP ファイル内の applet-desc タグで適切な幅と高さを指定してください。この動作も、今後のビルドで改善される可能性があります。

前述のいくつかの機能の具体例を次に示します。次のアプレットは、アプレットの上部にある赤いバーを左クリックしてドラッグすることにより、ブラウザから取り出すことができます。アプレットは isAppletDragStart メソッドを定義し、ドラッグジェスチャーをこのように変更します。ドラッグして取り出したアプレットは、アプレットの右上隅にある小さな「X」をクリックして閉じることができます。アプレットは setAppletCloseListener メソッドを定義し、閉じるボタンの視覚的な制御を取得します。アプレットがブラウザから切断されると、デスクトップショートカットを作成するためのプロンプトが表示されます。これは、アプレットの JNLP ファイルの <shortcut> タグを使用して実現されます。ショートカットアイコンをダブルクリックすると、Web ブラウザを開かずにアプレットを起動し直すことができます。

次のアプレットは、新しい Java Plug-In を必要とし、現在のところ IE 6 以降および Firefox 3 の初期アクセスビルドで動作します。Firefox 2 では動作しません。

アプレット上の 2 つのボタンは、ブラウザから切断されたときにアプレットに提供されているサービスがどのように変化するかを示しています。「Reopen Web Page」ボタンをクリックすると、AppletContext.showDocument() API が使用され、ブラウザがアプレットの元のページに移動します。アプレットをホストしている元の Web ページがまだ表示されている間にこのボタンをクリックした場合は、基本的に再ロードが強制実行され、アプレットがブラウザから切断されます。ただし、アプレットが切断されたあとは、このボタンをクリックしたときに JNLP の BrowserService API の動作として新しい Web ブラウザのウィンドウが開きます。これは、ブラウザから切断されたアプレットがブラウザのインスタンスと通信できなくなるためです。

「Show Applet Status」ボタンをクリックすると、アプレットがブラウザに接続している間はブラウザのステータスバーが変更され、アプレットがブラウザから切断されたあとは Java コンソールにその出力が表示されます。

この例のソースコードは次の場所からダウンロードできます。

デモ

Java Plug-In の新機能のデモが利用可能になりました。

その他のリソース

  • JavaOne 2008 の新しい Java Plug-In に関するセッションでは、アプレットの開発者が現在利用できる新しい機能の概要が示されています。
  • Java SE 6 Update 10 を対象とする「Ask the Experts」セッションでは、新しい Java Plug-In に関する一般的な質問への回答が示されています。

フィードバック

次世代 Java Plug-In に関するフィードバックを Java Plug-In forum までお送りください。

次世代 Java Plug-In のバグを発見した場合は、Sun Bug Reporter を使って報告してください。最初に、Sun Bug DatabaseJava Plugin カテゴリ内にあるサブカテゴリ plugin2 で、バグがすでに報告済みかどうかを確認してください。バグを提出するときは、「Product/Category」に「Java Plug-in」を、「Subcategory」に「plugin2」を指定して、次の情報を入力してください。

  • オペレーティングシステムの名前とバージョン
  • Web ブラウザの名前とバージョン
  • 動作しないアプレットの URL (自己完結型のテストケースであればなお良い)
  • アプレットの実行方法および障害の再現方法に関する明確な指示
  • 障害モードの内容 (つまり、期待される動作と現実の動作)
  • Java コンソールの出力 (Java コントロールパネルの「詳細」タブで Java コンソールを有効にする)
  • ログ出力 (Java コントロールパネルの「詳細」タブでロギングを有効にする)
    • Windows: ログの格納場所の例: C:/Documents and Settings/[username]/Application Data/Sun/Java/Deployment/log/
    • Unix: ログの格納場所: ~/.java/deployment/log/
    正しいログおよびトレースファイルを見つけてお送りください。