JDK 8u451では、JavaFXはJava SE 8の一部として含まれなくなりました。 その結果、javapackagerツールが削除されました。 詳細は、https://www.oracle.com/javase/javafxを参照してください。
埋込みJavaFXコンテンツを含むSwingアプリケーションを作成できます。 このページでは、このようなアプリケーションをデプロイする方法について説明します。
この節の内容は以下のとおりです。
既存のSwingアプリケーションで作業する開発者は、SwingアプリケーションにJavaFXコンテンツを統合することによって、JavaFXの機能を利用できます。 詳細は、チュートリアルのJavaFXアプリケーションとSwingアプリケーションに関する項を参照してください。
このガイドで説明しているすべての方法がJavaFXコンテンツを含むSwingアプリケーションに適用できるわけではありません。ただし、次の方法は該当します。
Swingアプリケーションのパッケージ化に同じパッケージ化ツールを使用できます。
配備ツールキットは、SwingアプリケーションをWebページに埋め込んだりブラウザから起動したりするために使用できます。
自己完結型アプリケーションの場合と同じ方法を使用して、アプリケーションをインストール可能なパッケージとしてバンドルおよびパッケージ化できます。
WebにJavaFXコンテンツが埋め込まれたSwingアプリケーションのデプロイメントは、Java Web Startアプリケーションまたはアプレットとしての通常のSwingアプリケーションのデプロイメントと似ています。 JavaチュートリアルのJavaアプレットおよびJava Web Startアプリケーションに関するレッスンを参照してください。
ただし、JavaFXを使用するには、アプリケーションのデプロイメント記述子(JNLPファイル)は、JREの依存性を表す必要があります。
6.2項「JavaFX Antタスクを使用したパッケージ化」で説明されているように、ハイブリッド・アプリケーションのパッケージ化にはAntタスクをお薦めします。 または、6.3項「パッケージ化ツールを使用しないパッケージ化」で説明されているように、既存のパッケージ化プロセスを手動で変更できます。
統合JavaFXコンテンツを含むSwingアプリケーションをパッケージ化するには、Antタスク(第5章「パッケージ化の基本」を参照)の同じセットを使用できます。 <fx:application>のtoolkit="swing"属性を使用して、アプリケーションのプライマリUIツールキットがSwingであるとマークすることのみを行う必要があります。
生成されるパッケージは、純粋なJavaFXアプリケーションのパッケージと似ています。 第5.2項、「"基本アプリケーション・パッケージ。"項」を参照してください 唯一の違いは、2つのデプロイメント記述子があることです - 1つはSwingアプレットとしてデプロイし、もう1つはJava Web Startを使用してアプリケーションを起動するためのものです。
例6-1は、JavaFXコードを含み、toolkit="swing"属性を使用するSwingアプリケーションのAntタスクのサンプルを示しています。
例6-1 JavaFX Antタスクを使用した統合JavaFXコンテンツを含むSwingアプリケーションのパッケージ化
<taskdef resource="com/sun/javafx/tools/ant/antlib.xml"
uri="javafx:com.sun.javafx.tools.ant"
classpath="${javafx.sdk.path}/lib/ant-javafx.jar"/>
<fx:jar destfile="dist-web/ColorfulCircles.jar">
<fx:application refid="myapp"/>
<fileset dir="build/classes/">
<include name="**"/>
</fileset>
</fx:jar>
<fx:deploy width="800" height="600" outdir="dist-web"
outfile="SwingInterop">
<fx:info title="Swing Interop"/>
<!-- Mark application as a Swing app -->
<fx:application id="myapp"
mainClass="swinginterop.SwingInterop"
toolkit="swing"/>
<fx:resources>
<fx:fileset dir="dist-web" includes="SwingInterop.jar"/>
</fx:resources>
</fx:deploy>
Swingアプリケーションにはデフォルトのプリローダーがないため、アプリケーションの準備ができたときにHTMLスプラッシュ画面を非表示にするコードがありません。 そのため、デフォルトでは、生成されたHTMLページはHTMLスプラッシュ画面を使用しません。
スプラッシュ画面を有効にするには、次のタスクの両方を実行します。
コード・スプラッシュ・コールバックonGetSplashを明示的に定義します。 たとえば、例6-2のマークアップを例6-1に追加します。
例6-2 コード・スプラッシュ・コールバックonGetSplashの定義
<fx:callbacks>
<!-- force use of default splash handler -->
<fx:callback name="onGetSplash">
(new dtjava.Callbacks()).onGetSplash
</fx:callback>
</fx:callbacks>
コールバックおよび<fx:callbacks>の詳細、および<fx:callbacks>の使用の詳細は、19.2項「コールバック」を参照してください。
例6-3に示すように、LiveConnectを使用してJavaコードからJavaScript関数dtjava.hideSplash()を呼び出すことによって、アプリケーションの準備ができたときにHTMLスプラッシュ画面を明示的に非表示にするコードを追加します。
Java Web Startアプリケーションまたはアプレットとしてのパッケージ化に対する既存のサポートがプロジェクトにすでにある場合、JNLPファイルのテンプレートを直接変更するほうが容易な場合があります。
JavaFXランタイムへの依存性を表すには、JNLPファイルに次の変更を行います。
jfx:のJavaFX名前空間を定義します。
JREの最低限必要なバージョンはJRE 7 update 6以降であることを指定します。
例6-4は、デプロイメント記述子へのこれらの変更の例を示しています。
例6-4 デプロイメント記述子の変更
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0"
xmlns:jfx="http://javafx.com"
href="SwingAppWithJavaFXContent.jnlp"
...>
....
<resources>
<j2se version="1.7.0_06+"
href="http://java.sun.com/products/autodl/j2se"/>
</resources>
...
</jnlp>
HTML側への変更は必要ありません。 ただし、次の項の例に示すように、コンテンツのWebページとの統合に配備ツールキットを使用することもできます。
アプリケーションをアプレットとしてデプロイしたり、ブラウザから起動したりする際には、配備ツールキットを使用することをお薦めします。 配備ツールキットは、デプロイメントのルーチン(必要なJREが使用可能であることを確認するなど)を簡略化します。 配備ツールキットには、次のような追加の機能もいくつかあります。
JVMオプションまたは引数をアプリケーションに動的に渡します。 19.3.4項「プラットフォーム要件の指定およびJVMオプションの受渡し」および19.3.3項「Webアプリケーションへのパラメータの受渡し」を参照してください。
使用手順は、JavaFXアプリケーションの場合とほとんど同じです。 唯一の要件は、プラットフォーム要件の1つとしてSwingツールキットを指定することです。
たとえば、例6-5は、Swing Java Web Startアプリケーションを起動するためのWebページ・コードを示しています。 このコードは、JavaFXアプリケーションの起動に使用するものと同じです。
例6-5 Java Web StartアプリケーションのHTMLページのスクリプトおよびマークアップ
<html>
<head>
<SCRIPT src="https://java.com/js/dtjava.js"></SCRIPT>
<script>
function launchApplication(jnlpfile) {
dtjava.launch(
{ url : jnlpfile,
toolkit : 'swing'
}
{
javafx : '2.2+'
},
{}
);
return false;
}
</script>
</head>
<body>
<h2>Test page</h2>
<a href='SampleApp.jnlp'
onclick="return launchApplication('SampleApp.jnlp');">Click</a>
to launch test app.
</body>
</html>
例6-5は単純ですが、必要に応じて、Swingアプリケーションの配備ツールキットでdtjava.launch()メソッドの他の機能を使用できます。 たとえば、すばやく起動するために、JNLPファイルをWebページに埋め込むことができます。
アプレットの場合も、アプローチは同様です。 dtjava.embed()関数を使用して、アプレットをWebページに埋め込むことができます。 swingツールキットを指定して、配備ツールキットのアプリケーション・タイプのプリファレンスを示す必要もあります。
別の警告が、配備ツールキットでの組込みHTMLスプラッシュのサポートに関係します。 Swingアプリケーションにはデフォルトのプリローダーがないため、アプリケーションの準備ができたときにHTMLスプラッシュ画面を非表示にするコードがありません。 この違いに対処するには、次のいずれかの方法を使用します。
例6-6に示すように、LiveConnectを使用してJavaコードからJavaScript関数dtjava.hideSplash()を呼び出すことによって、アプリケーションの準備ができたときにHTMLスプラッシュ画面を明示的に非表示にするコードを追加します。
例6-7および19.3.6項「HTMLスプラッシュ画面の無効化」に示すように、何も行わないカスタム・スプラッシュ・コールバックを指定します。
例6-7 HTMLスプラッシュ画面を無効化するカスタム・コールバック
<html>
<head>
<SCRIPT src="https://java.com/js/dtjava.js"></SCRIPT>
<script>
function embedApp() {
dtjava.embed(
{
id : 'sampleApp',
url : 'SampleApp_browser.jnlp',
placeholder : 'app-placeholder',
width : 960,
height : 720,
toolkit : 'swing'
},
{
javafx : '2.2+'
},
{ onGetSplash: function() {} } //disable splash
);
}
<!-- Embed Swing application into web page after page is loaded -->
dtjava.addOnloadCallback(embedApp);
</script>
</head>
<body>
<h2>Test page</h2>
<!-- Applet will be inserted here -->
<div id='javafx-app-placeholder'></div>
</body>
</html>