2016-08-12 2 views
0

次のコードをJava環境でnashornを使用して実行しようとしています。 Code DocコマンドラインスイッチをNashorn JavaScriptエンジンに渡す

load("fx:base.js"); 
load("fx:controls.js"); 
load("fx:graphics.js"); 

var material = new PhongMaterial(); 
material.diffuseColor = Color.LIGHTGREEN; 
material.specularColor = Color.rgb(30, 30, 30); 

var meshView = Java.to([ 
    new Box(200, 200, 200), 
    new Sphere(100), 
    new Cylinder(100, 200) 
], "javafx.scene.shape.Shape3D[]"); 

for (var i = 0; i != 3; i++) { 
    meshView[i].material = material; 
    meshView[i].translateX = (i + 1) * 220; 
    meshView[i].translateY = 200; 
    meshView[i].translateZ = 20; 
    meshView[i].drawMode = DrawMode.FILL; 
    meshView[i].cullFace = CullFace.BACK; 
}; 

var pointLight = new PointLight(Color.WHITE); 
pointLight.translateX = 800; 
pointLight.translateY = -200; 
pointLight.translateZ = -1000; 

var root = new Group(meshView); 
root.children.add(pointLight); 

var scene = new Scene(root, 800, 400, true); 
scene.fill = Color.rgb(127, 127, 127); 
scene.camera = new PerspectiveCamera(false); 
$STAGE.scene = scene; 
$STAGE.show(); 

これは、JavaScript APIを使用してJavaFxシーンを作成します。

あなたはそれが期待通りに動作しますが、あなたは、Javaコードを経由してnashornスクリプトエンジンと同じファイルを実行した場合、それは

Exception in thread "main" java.lang.ExceptionInInitializerError 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:348) 
    at jdk.nashorn.internal.runtime.Context.findClass(Context.java:983) 
    at jdk.nashorn.internal.objects.NativeJava.simpleType(NativeJava.java:489) 
    at jdk.nashorn.internal.objects.NativeJava.type(NativeJava.java:320) 
    at jdk.nashorn.internal.objects.NativeJava.type(NativeJava.java:312) 
    at jdk.nashorn.internal.objects.NativeJava.type(NativeJava.java:308) 
    at jdk.nashorn.internal.scripts.Script$Recompilation$3$500A$\=fx\!base.LOAD_FX_CLASSES(fx:base.js:38) 
    at jdk.nashorn.internal.scripts.Script$4$\=fx\!controls.:program(fx:controls.js:30) 
    at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:636) 
    at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:229) 
    at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:387) 
    at jdk.nashorn.internal.runtime.Context.evaluateSource(Context.java:1150) 
    at jdk.nashorn.internal.runtime.Context.load(Context.java:799) 
    at jdk.nashorn.internal.objects.Global.load(Global.java:995) 
    at jdk.nashorn.internal.scripts.Script$\^eval\_.:program(<eval>:2) 
    at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:636) 
    at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:229) 
    at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:387) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:437) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:401) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:397) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:147) 
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:212) 
    at com.metalop.nashorn.javafx.GettingStarted.main(GettingStarted.java:23) 
Caused by: java.lang.IllegalStateException: Toolkit not initialized 
    at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:273) 
    at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:268) 
    at com.sun.javafx.application.PlatformImpl.setPlatformUserAgentStylesheet(PlatformImpl.java:550) 
    at com.sun.javafx.application.PlatformImpl.setDefaultPlatformUserAgentStylesheet(PlatformImpl.java:512) 
    at javafx.scene.control.Control.<clinit>(Control.java:87) 
    ... 25 more 

そうか、次の例外がスローされます-fxスイッチでjjsコマンドラインユーティリティを使用している場合私は-fxスイッチを渡すか、javafxをJavaコードのnashornにinitilizeしますか?

+1

私は重要な部分がルート 'IllegalStateException:Toolkit not initialized'例外であると信じています。つまり、JavaFXを起動しなくてもJavaFXコードを実行していることになります( 'javafx.application.Application'の機能)。ですから、Javaアプリケーションを 'javafx.application.Application'で実行するのは、' Main'クラスだけでなく、1つの解決策です。 –

+0

@NikosParaskevopoulos:アプリケーションからクラスを拡張すると、依存関係がロードされ、問題が解決されました。コメントありがとう...! – Shiva

答えて

0

JavaScriptを使用して、-fxを渡すと、ナショーンの引数がうまくいきませんでした。ニコスによってコメントにクラスを述べたように

  1. javafx.application.‌​Applicationから延びるように有しており、主な機能は、その後、Nashornの初期化とJSのスクリプト実行のためのコードを有するlaunch()を呼び出す必要があります。

  2. 開始方法にはstart(Stage primaryStage)という署名があります。評価中にStageオブジェクトをJavaScriptにバインドする必要がありました。

次のコードは、どのように達成できたかのサンプルです。

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 
import javax.script.SimpleBindings; 

import javafx.application.Application; 
import javafx.stage.Stage; 

public class GettingStarted extends Application { 

    public static void main(String args[]) { 

     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); 

     try (InputStream is = GettingStarted.class.getResourceAsStream("getting-started.js")) { 

      BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
      SimpleBindings bindings = new SimpleBindings(); 
      bindings.put("$STAGE", primaryStage); 
      engine.eval(reader, bindings); 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

} 
0

Nashornエンジンをjdk.nashorn.api.scripting.NashornScriptEngineFactoryでインスタンス化します。これは、文字列の配列を取るオーバーロードがgetScriptEngineであり、これはコマンドラインの引数です。

javax.scriptインターフェイスではこれを行うことはできませんが、jdk.nashorn.api.scriptingも公開され、サポートされているAPIです。

+0

'NashornScriptEngineFactory'を使い、' -fx'パラメータを渡してみましたが、うまく動作しませんでした。あなたの指針は有益で有益でしたが、ありがとう! – Shiva

0

Attilaが述べたように、javax.scriptで引数を渡す方法はありません。

(1)使用Nashorn固有のAPI - >https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/NashornScriptEngineFactory.html

(または)

(2)あなたのjavaコマンドラインで "nashorn.args" システムのプロパティを定義します。次の2つのオプションをしました。

も参照してください:https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notesいずれの場合も

、私はケース内の特定のオプションわからないんだけど、「-fx」に働くだろう。これは、FXコードには "jjs"ツールの世話をする特定の初期化要件があるためです。それがスクリプトエンジン 埋め込みモードで動作するかどうかは不明です。

+0

答えをくれてありがとう、すぐに試しましたが、 '-fx' argはここでは動作しませんでした。 – Shiva

関連する問題