プログラマメモ2 - programmer no memo2

javafx スクリプトエンジンがないので 2007/10/02

むーん、調べてみたところ、現時点でmac osxではjava6はまだまだっぽい。次のosxがでるときにあわせてでてくれたらいいなぁという希望をもってはいますが。

osxでeclipseで、javafxをFXShellを使わず実行してみたいです。
java5です。

javaFXはどこからダウンロードするのだろうと、悩みつつ、
openjfx: ホーム
からおとしてきました。

で、含まれているjarはみっつ。
Filters.jar
javafxrt.jar
swing-layout.jar
これをビルドパスに通します。

jarを覗きますと、net.java.javafx.jsr223.JavaFXScriptEngineというクラスがあります。
スクリプトエンジンぽいです。というかスクリプトエンジンです。

しかし、java5では、これは実行できません。

evalあたりのコードをみて、を拝借して実行すれば動くようです。

というわけで、作成。

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

import javax.swing.SwingUtilities;

import net.java.javafx.type.Module;
import net.java.javafx.type.Value;
import net.java.javafx.type.ValueList;
import net.java.javafx.type.expr.CompilationUnit;
import net.java.javafx.typeImpl.Compilation;
import net.java.javafx.typeImpl.TypeFactoryImpl;

public class Test {

public static void main(String[] args) throws Exception {

InputStream stream = Test.class.getResourceAsStream("test.fx");
final Reader reader = new InputStreamReader(stream, "utf-8");

SwingUtilities.invokeLater(new Runnable() {

public void run() {
Object object;
try {
object = eval(reader);
System.out.println(object);
System.out.println(object.getClass());
} catch (Exception e) {

throw new RuntimeException(e);
}

}

});

}

public static Object eval(Reader reader) throws Exception {
Module module;
Compilation compilation;

module = (new TypeFactoryImpl()).createModule();
compilation = new Compilation(module);

CompilationUnit compilationUnit = compilation.readCompilationUnit(
"script", reader);
ValueList result = null;

result = compilationUnit.execute();

if (result == null)
return null;
Object arr[] = new Object[result.getSize()];
for (int i = 0; i < arr.length; i++) {
Value value = result.getValue(i);
arr[i] = value.get();
if (arr[i] == null)
arr[i] = value;
}

if (arr.length == 1)
return arr[0];
else
return ((Object) (arr));
}
}


それで、適当にjavaFXのコードを作成。

import javafx.ui.*;
Frame {
title : "JavaFXテスト"
width : 420
height : 240
content: Label {
text: "OK みえました?"
}
centerOnScreen: true
visible: true
};


なんとか動きました。

最終目標はjavaFXとして動かすのではなく、javaアプリからjavaFXを必要なときに実行したいのですが、今度は、javaFXのオブジェクトの操作、javaFX側からデータオブジェクトの操作とかしないといけないんですよね。。。。
ゆっくり考えよう。

: