3 NashornとJavaFX
NashornでのJavaFXスクリプト・アプリケーションの解釈
JavaFXスクリプト・アプリケーションをNashornで解釈するには、-fxオプションを指定したjjsコマンドを使用します。たとえば、次のコマンドはNashornを呼び出してJavaFXscript.jsファイルを解釈します。
                     
jjs -fx --module-path /SOMEDIR/javafx-sdk-11/lib --add-modules javafx.controls JavaFXscript.js 
注意:
- 
                              スクリプトをJavaFXアプリケーションとして起動するには、JavaFXモジュールを明示的に追加する必要があります。それらを追加しないと、 jjsコマンドがメッセージを出力して終了します。jjs -fx JavaFXscript.jsJavaFXは使用できません。
- 
                              JavaFXモジュールには、javafx.base、javafx.controls、javafx.fxml、javafx.graphics、javafx.media、javafx.swingおよびjavafx.webがあります。アプリケーションが --add-modulesオプションで必要とするすべてのモジュールを必ず指定してください。
- 
                              OpenJFXからJavaFXを取得します。 
JavaFXスクリプト・アプリケーションは、同等のJavaアプリケーションとほぼ同じですが、Nashornを使用してJavaFX構文の多くを簡略化できます。通常、JavaFXスクリプト・アプリケーションにはstart()関数のみが含まれますが、これはJavaアプリケーションのstart()メソッドと同等です。また、init()およびstop()関数を含めることもできます。
                     
Nashornを使用したJavaFXスクリプト・アプリケーションの簡略化
Nashornを使用すると、特定のタイプを宣言することなくJavaFXコードを簡略化でき、特定のメソッドおよびプロパティに容易にアクセスできます。
「JavaFXアプリケーション(HelloWorld.java)の例」および「JavaFXスクリプト・アプリケーション(HelloWorld.js)の例」の例を分析すると、JavaFXアプリケーションをスクリプトとして作成したときに、NashornによってJavaコードがどのように簡略化されるかがわかります。
- 
                           変数型の宣言、パッケージのインポート、注釈の使用、クラス名の指定、およびクラスの main()メソッドの実装が不要になります。
- 
                           宣言する必要があるのは、インスタンス化されるJavaFXクラスのみです。 
- 
                           JavaBeansは、 getおよびset接頭辞が不要になり、JavaメソッドではなくJavaScriptプロパティとして扱われます。「JavaBeansの使用」を参照してください。
- 
                           javafx.event.EventHandlerインタフェースを実装するときに、実装されるメソッドを明示的に指定する必要はありません。handle()が唯一のメソッドであるため、Nashornは指定された関数をメソッドに自動的に適用します。「Javaクラスの拡張」を参照してください。
JavaFXのプライマリ・ステージは、Nashornではグローバル・プロパティ$STAGEとして使用できます。このグローバル・プロパティを使用すると、スクリプト全体を1つのstart()関数として扱うことができます(その場合でも、init()およびstop()関数を追加できます)。「JavaFXスクリプト・アプリケーションの簡易バージョン(HelloWorldSimple.js)の例」には、「JavaFXスクリプト・アプリケーション(HelloWorld.js)の例」のJavaFXスクリプト・アプリケーションを簡略化したバージョンのソース・コードが含まれています。
                     
JavaFXアプリケーション(HelloWorld.java)の例
次の例のHelloWorld.javaには、1つのボタンを表示する簡単なJavaFXアプリケーションのソース・コードが含まれています。このボタンをクリックすると、標準出力に"Hello World!"が出力されます。
                     
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();
    }
}JavaFXスクリプト・アプリケーション(HelloWorld.js)の例
次の例のHelloWorld.jsには、1つのボタンを表示するJavaFXスクリプト・アプリケーションのソース・コードが含まれています。このボタンをクリックすると、標準出力に"Hello World!"が出力されます。
                     
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();
}
JavaFXスクリプト・アプリケーションの簡易バージョン(HelloWorldSimple.js)の例
次の例のHelloWorldSimple.jsには、グローバル・プロパティ$STAGEを使用して、JavaFXスクリプト・アプリケーションを簡略化したバージョンのソース・コードが含まれています。
                     
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();
Nashornスクリプトのオブジェクト
ほとんどの場合、staticフィールドにアクセスするためにインスタンス化または使用するクラスを追加するだけで済むはずです。ただし、プロトタイプを作成する場合は、JavaFXのパッケージとクラスのグループをインポートするためにロードできる一連のスクリプトがNashornに事前定義されています。スクリプトは、スクリプト名の文字列を取るload()関数を使用してロードできます。
                  
次の表に、組込み可能な定義済のスクリプト・オブジェクトを示します。
| スクリプト | インポートされるもの | 
|---|---|
| fx:base.js | 
 | 
| fx:graphics.js | 
 | 
| fx:controls.js | 
 | 
| 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 | 
「スクリプトをロードするJavaFXスクリプト・アプリケーションの例」には、「JavaFXスクリプト・アプリケーションの簡易バージョン(HelloWorldSimple.js)の例」のJavaFXスクリプト・アプリケーションを、load()関数を使用して必要なパッケージとクラスをインポートするように簡略化したソース・コードが含まれています。
                     
スクリプトをロードするJavaFXスクリプト・アプリケーションの例
次の例には、load()関数を使用してパッケージおよびクラスをインポートする、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スクリプト・アプリケーションの例については、「JavaFXスクリプト・アプリケーションの例」を参照してください。