Java Platform, Standard Edition Nashornユーザーズ・ガイド
目次      

3 NashornとJavaFX

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コードがどのように簡略化されるかがわかります。

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スクリプト・アプリケーションの例」を参照してください。

目次      

Copyright © 1993, 2025, Oracle and/or its affiliates. All rights reserved.