@Grab('org.codehaus.groovyfx:groovyfx:0.4.0') import static groovyx.javafx.GroovyFX.start import javafx.beans.value.ChangeListener import javafx.event.EventHandler import static javafx.concurrent.Worker.State.* import javafx.concurrent.Task class ProcessTask extends Task { def expression ProcessTask(expression) { this.expression = expression } @Override protected String call() throws Exception { Eval.me(this.expression) } }; class FX { def process(expression, deferred) { def task = new ProcessTask(expression) task.messageProperty().addListener( { s, o, n -> println n.value } as ChangeListener) task.onSucceeded = { event -> deferred?.call('resolve', task.value) } as EventHandler task.onFailed = { event -> deferred?.call('reject', task.exception.message) } as EventHandler new Thread(task).start() } } start { stage(title: 'AngularFX', visible: true) { scene(width: 800, height: 600) { borderPane { vbox { webView = webView() } } } } webView.engine.loadWorker.stateProperty().addListener({ t, o, n -> if (n == SUCCEEDED) { webView.engine.executeScript("window").setMember("FX", new FX()) } } as ChangeListener) webView.engine.onError = { event -> println 'error: ' + event.message } as EventHandler // Capture alerts webView.engine.onAlert = { event -> println 'alert: ' + event.data.toString() } as EventHandler webView.engine.load("file:///${System.getProperty('user.dir')}/angularfx.html") }