今回が本連載の最終回です。最終回ということで、
なお、
4種類のアプリケーション実行
今まで、
NetBeansの左側のプロジェクトペインでプロジェクトを右クリックするとポップアップメニューが表示されます


左側の

ラジオボタンには次の4つの選択肢があります。
- Standard Execution
- Web Start Execution
- Run in Browser
- Run in Mobile Emulator
デフォルトではStandard Executionが選択されています。これが、
Java Web Startによる実行
まずはじめに、
すると、


これでJava Web Startでアプリケーションが起動できました。起動時の流れは違いますが、

アプリケーションの署名を行うには、

ただし、

正式な証明書を使用した署名を行う場合、
証明書を取得しキーストアにインポートしたら、
jnlp.signjar.keystore=<キーストアの場所>
jnlp.signjar.storepass=<キーストアのパスワード>
jnlp.signjar.keypass=<キーのパスワード>
jnlp.signjar.alias=<別名>
また、
アプレットによる実行
次にアプレットでアプリケーションを実行してみましょう。アプレットで実行するには、

ところが、
右側のカテゴリのうち、
これで実行すると、


モバイルエミュレータによる実行
最後に残されたのが、
では、

今のところ、

デバイスを変更したら、

このようにJavaFX Mobileでアプリケーションを実行するためにソースを変更することは必要ありません。しかし、
JavaFX Mobileで使用できるAPIを調べるには、
使用できない主なAPIとして、

デプロイメント
前節の説明で、
Java Web Startのデプロイメント
NetBeansでJavaFXのアプリケーションをビルドすると、
- アプリケーションのJARファイル
- Java Web Start用のJNLPファイル
- アプレット用のJNLPファイル
- アプレットを埋めこんだHTMLファイル
JavaFX Mobileでビルドした場合には、
JNLP
したがって、
ここで、
ここでは、
このJNLPファイルはNetBeansがアプリケーションを起動する時の設定になっているので、
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://localhost:8082/servlet/org.netbeans.modules.javafx.project.JnlpDownloadServlet/C%3A/NetBeansProjects/whackamole/dist/" href="whackamole.jnlp">
<information>
<title>whackamole</title>
<vendor>Yuichi Sakuraba</vendor>
<homepage href="http://localhost:8082/servlet/org.netbeans.modules.javafx.project.JnlpDownloadServlet/C%3A/NetBeansProjects/whackamole/dist/"/>
<description>whackamole</description>
<offline-allowed/>
<shortcut>
<desktop/>
</shortcut>
</information>
<resources>
<j2se version="1.5+"/>
<extension name="JavaFX Runtime" href="http://dl.javafx.com/1.1/javafx-rt.jnlp"/>
<jar href="whackamole.jar" main="true"/>
</resources>
<application-desc main-class="whackamole.Main">
</application-desc>
</jnlp>
編集が必須なのは赤字で示したjnlpタグのcodebase属性です。また、
codebase属性にはNetBeansが内部的に起動するWebサーバでのURLになっています。これをアプリケーションをデプロイするURLに変更します。そして、
たとえば、
オレンジで示した部分は起動した時にショートカットを作成するかどうかのダイアログを表示するかどうかを決めています。先ほど、
その他のtitleタグやvendorタグ、
次にWebサーバの設定を行います。具体的には、
application/x-java-jnlp-file JNLP
後はJARファイルとJNLPをWebサーバにデプロイメントすれば、
アプレットのデプロイメント
アプレットのデプロイメントもJNLPファイルの編集が必要です。必須の編集箇所もJava Web Startの場合と同じくjnlpタグのcodebase属性です。ただし、
JNLPファイルのcodebase属性が絶対URLでコードベースが指定されていた場合、
次にNetBeansが生成したHTMLファイルを見てみましょう。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>whackamole</title>
</head>
<body>
<h1>whackamole</h1>
<script src="http://dl.javafx.com/1.1/dtfx.js"></script>
<script>
javafx(
{
archive: "whackamole.jar",
draggable: true,
width: 240,
height: 240,
code: "whackamole.Main",
name: "whackamole"
}
);
</script>
</body>
</html>
アプレットといえばappletタグですが
このjavafx関数は青字で示したdtfx.
また、
では、
draggableに関しては後述します。次のwidthとheightがアプレットのサイズです。図10で指定した値はここに書き込まれます。codeはアプリケーションのメインスクリプトです。nameはその名の通りアプリケーションの名前を指定します。
NetBeansが生成したHTMLファイルは必要最低限の記述しかされていないので、
アプレットの場合、
図16からwhackamoleのアプレットページに移動することができます。先ほどから何度も使用しているwhackamoleですが、
スコアも何もない単純なゲームですが、
アプレットの拡張
先ほど、
ドラッガブルアプレットというのは、
では実際にドラッガブルアプレットを試してみましょう。ここではイメージを表示するだけのアプレットを使用しています。JavaFXではデフォルトでドラッガブルアプレットが有効になっています。これを変更するには図10のDragabble Appletのチェックを外します。
ブラウザ上でアプレットが起動している状態で、
図17 a)が通常のアプレットの状態です。そこで、
図17 ドラッガブルアプレット
a) 通常のアプレット




このようにJavaFXではドラッガブルアプレットが実現できます。しかし、
Stage {
title: "Applet Sample"
style: StageStyle.UNDECORATED
extensions: [
AppletStageExtension {
shouldDragStart: function(event: MouseEvent): Boolean {
// ドラッグのキーをカスタマイズする
// Ctrlキーとマウスの左ボタンでドラッグさせる
return event.controlDown and event.primaryButtonDown;
}
// アプレットの右上の×ボタンを表示しない
useDefaultClose: false
}
]
scene: Scene {
width: 300
height: 200
content: [
ImageView {
image: Image {
url: "{__DIR__}tree.jpg"
}
}
]
}
};
アプレットに関する拡張はStageクラスのextensionsアトリビュートに記述します。extensionsアトリビュートの型は、
ドラッガブルアプレットにおけるドラッグ開始の指定を行うのが、
引数としてjavafx.
そして、
しかし、
とはいうものの、
そこで、
// アプレットのパラメータでアプレットで動作しているかどうかを設定する
var isApplet = "true".equals(FX.getArgument("isApplet"));
Stage {
title: "Applet Sample"
style: StageStyle.UNDECORATED
extensions: [
AppletStageExtension {
shouldDragStart: function(event: MouseEvent): Boolean {
// ドラッグのキーをカスタマイズする
// Ctrlキーとマウスの左ボタンでドラッグさせる
return event.controlDown and event.primaryButtonDown;
}
onAppletRestored: function(): Void {
// ブラウザで動作させる時にはタイトルバーを表示しない
isApplet = true;
}
onDragFinished: function(): Void {
// ドラッグが終了したらタイトルバーを表示する
isApplet = false;
}
// アプレットの右上の×ボタンを表示しない
useDefaultClose: false
}
]
scene: Scene {
width: 300
height: 200
content: [
ImageView {
image: Image {
url: "{__DIR__}tree.jpg"
}
},
// タイトルバー
TitleBar {
// isApplet変数の値によって透明、不透明を設定する
opacity: bind if (isApplet) 0.0 else 1.0
}
]
}
};
TitleBarクラスが自作のタイトルバーを表します。TitleBarオブジェクトの非透明度を表すopacityアトリビュートは、
ここで問題になるのがisApplet変数の初期値です。アプレットが動作を開始した時に、
そこで、
HTMLファイルに記述されたパラメータはjavafx.
次にHTMLファイルを編集します。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>appletsample</title>
</head>
<body>
<h1>appletsample</h1>
<script src="http://dl.javafx.com/1.1/dtfx.js"></script>
<script>
javafx(
{
archive: "appletsample.jar",
draggable: true,
width: 300,
height: 200,
code: "appletSample",
name: "appletsample"
},
{
isApplet: "true"
}
);
</script>
</body>
</html>
追加した部分を赤字で示しました。このように、
NetBeansはビルドのたびにHTMLファイルを生成してしまうので、
これで、
a) ブラウザ上で動作している場合はタイトルバーを非表示
b) ドラッグするとタイトルバーを表示
JavaFX SDK
最後に少しだけJavaFX SDKを使った開発について紹介しておきます。
JavaFX SDKをインストールすると、
コマンド名 | 説明 |
javafxc | JavaFX Scriptのコンパイラ |
javafx | JavaFX Scriptの実行コマンド |
javafxdoc | ドキュメント生成コマンド |
javafxpackager | パッケージ作成コマンド |
javafxcコマンドはJavaのjavacコマンドに相当し、
C:\NetBeansProjects\whackamole\src>javafxc whackamole\Main.fx C:\NetBeansProjects\whackamole\src>javafx whackamole.Main
Main.
先ほどのjavafxcコマンドはjavacコマンドに、
C:\NetBeansProjects\whackamole\src>java -cp C:\javafx-sdk1.1\lib\shared\*;C:\javafx-sdk1.1\lib\desktop\*;. whackamole.Main
ここからわかることは、
表1の最後のjavafxpackagerコマンドは、
C:\NetBeansProjects\whackamole\src>javafxpackager -profile desktop -appName whackamole -appClass whackamole.Main -src .
オプションの意味はだいたいおわかりになるはずです。-profileオプションにdesktopを指定すると、
-appNameオプションと-appClassオプションはそれぞれアプリケーションの名前とメインクラスを指定します。これらの値はJNLPファイル、
デフォルトではパッケージはdistディレクトリに生成されます。変更したい場合は-dオプションで指定します。これ以外にもオプションがあります。詳しくはSDKに同胞されているjavafxpackagerのドキュメントを参照してください。
JavaFX SDKにはモバイルエミュレータも提供されています。こちらはemulator/
C:\NetBeansProjects\whackamole\dist>emulator -Xdevice:DefaultFxPhone1 -Xdescriptor:whackamole.jad
-Xdeviceオプションでデバイスを指定し、
さて、
本連載を通して、
なお、
本連載は今回が最終回ですが、