JDK 8u451では、JavaFXはJava SE 8の一部として含まれなくなりました。 詳細は、https://www.oracle.com/javase/javafxを参照してください。
この章では、Nashornエンジンで解釈されるスクリプトを使用してJavaFXアプリケーションを作成および実行する方法について説明します。 JavaFXに習熟していることを前提としています。 詳細は、JavaFXのドキュメント(http://docs.oracle.com/javase/8/javafx/)を参照してください
JavaFXスクリプト・アプリケーションをNashornで解釈するには、-fxオプションを指定したjjsコマンドを使用します。 たとえば、次のコマンドはNashornを呼び出してJavaFXscript.jsファイルを解釈します。
jjs -fx JavaFXscript.js
jjsの詳細は、このツールのリファレンス・ページ(http://docs.oracle.com/javase/jp/8/technotes/tools/windows/jjs.html)を参照してください。
JavaFXスクリプト・アプリケーションは、同等のJavaアプリケーションとほぼ同じですが、Nashornを使用してJavaFX構文の多くを簡略化できます。 通常、JavaFXスクリプト・アプリケーションにはstart()関数のみが含まれますが、これはJavaアプリケーションのstart()メソッドと同等です。 また、init()およびstop()関数を含めることもできます。
例3-1には、1つのボタンを表示する簡単なJavaFXアプリケーションのソース・コードが含まれています。このボタンをクリックすると、標準出力に"Hello World!"が出力されます。
例3-1 JavaFXアプリケーション(HelloWorld.java)
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class HelloWorld extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
}
例3-2には、例3-1のJavaコードに対応するJavaFXスクリプト・アプリケーションのソース・コードが含まれています。
例3-2 JavaFXスクリプト・アプリケーション(HelloWorld.js)
var Button = javafx.scene.control.Button;
var StackPane = javafx.scene.layout.StackPane;
var Scene = javafx.scene.Scene;
function start(primaryStage) {
primaryStage.title = "Hello World!";
var button = new Button();
button.text = "Say 'Hello World'";
button.onAction = function() print("Hello World!");
var root = new StackPane();
root.children.add(button);
primaryStage.scene = new Scene(root, 300, 250);
primaryStage.show();
}
例3-1と例3-2は、どちらも同じ結果、つまり、「Say 'Hello World'」というラベルが付いたボタンを含む「Hello World!」というタイトルのウィンドウを生成します。
前の2つの例を分析すると、JavaFXアプリケーションをスクリプトとして作成したときに、NashornによってJavaコードがどのように簡略化されるかがわかります。
変数型の宣言、パッケージのインポート、注釈の使用、クラス名の指定、およびクラスのmain()メソッドの実装が不要になります。
宣言する必要があるのは、インスタンス化されるJavaFXクラスのみです。
JavaBeansは、getおよびset接頭辞が不要になり、JavaメソッドではなくJavaScriptプロパティとして扱われます。 詳細は、「JavaBeansの使用」を参照してください。
javafx.event.EventHandlerインタフェースを実装するときに、実装されるメソッドを明示的に指定する必要はありません。 handle()が唯一のメソッドであるため、Nashornは指定された関数をメソッドに自動的に適用します。 詳細は、「Javaクラスの拡張」を参照してください。
JavaFXのプライマリ・ステージは、Nashornではグローバル・プロパティ$STAGEとして使用できます。 このグローバル・プロパティを使用すると、スクリプト全体を1つのstart()関数として扱うことができます(その場合でも、init()およびstop()関数を追加できます)。 例3-3には、例3-2のJavaFXスクリプト・アプリケーションを簡略化したバージョンのソース・コードが含まれています。
例3-3 JavaFXスクリプト・アプリケーションの簡易バージョン(HelloWorldSimple.js)
var Button = javafx.scene.control.Button;
var StackPane = javafx.scene.layout.StackPane;
var Scene = javafx.scene.Scene;
$STAGE.title = "Hello World!";
var button = new Button();
button.text = "Say 'Hello World'";
button.onAction = function() print("Hello World!");
var root = new StackPane();
root.children.add(button);
$STAGE.scene = new Scene(root, 300, 250);
$STAGE.show();
ほとんどの場合、staticフィールドにアクセスするためにインスタンス化または使用するクラスを追加するだけで済むはずです。 ただし、プロトタイプを作成する場合は、JavaFXのパッケージとクラスのグループをインポートするためにロードできる一連のスクリプトがNashornに事前定義されています。 スクリプトは、スクリプト名の文字列を取るload()関数を使用してロードできます。 次の表に、組込み可能な定義済のスクリプト・オブジェクトを示します。
| スクリプト | インポートされるもの |
|---|---|
| fx:base.js | javafx.stage.Stage javafx.scene.Scene javafx.scene.Group javafx/beans javafx/collections javafx/events javafx/util |
| fx:graphics.js | javafx/animation javafx/application javafx/concurrent javafx/css javafx/geometry javafx/print javafx/scene javafx/stage |
| fx:controls.js | javafx/scene/chart javafx/scene/control |
| fx:fxml.js | javafx/fxml |
| fx:web.js | javafx/scene/web |
| fx:media.js | javafx/scene/media |
| fx:swing.js | javafx/embed/swing |
| fx:swt.js | javafx/embed/swt |
例3-4には、例3-3のJavaFXスクリプト・アプリケーションを、load()関数を使用して必要なパッケージとクラスをインポートするように簡略化したソース・コードが含まれています。
例3-4 スクリプトをロードするJavaFXスクリプト・アプリケーション
load("fx:base.js");
load("fx:controls.js");
load("fx:graphics.js");
$STAGE.title = "Hello World!";
var button = new Button();
button.text = "Say 'Hello World'";
button.onAction = function() print("Hello World!");
var root = new StackPane();
root.children.add(button);
$STAGE.scene = new Scene(root, 300, 250);
$STAGE.show();
JavaFXスクリプト・アプリケーションのその他の例については、付録A「JavaFXスクリプト・アプリケーションの例」を参照してください。