Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

[WebView] executeScript not working...? Whats wrong?

984052Jan 10 2013 — edited Jan 14 2013
Hello!

I'm working on a client solution, using an HTML-markup as the UI, loaded into a WebView. It works great at all. But one point is totally freaking me out.

According to this tutorial: http://docs.oracle.com/javafx/2/webview/jfxpub-webview.htm

It is of course possible to execute Javascript via Java code. Its pretty amazing and I want to use that function, but it does not work at all. Example 5 shows the implementation for hide and show buttons, which purpose is to execute Javascript code, directly embedded in the markup of the forums page. I completely copy-pasted that example in a class, execution was no deal, everything works fine. So I started an own example to get familiar with the executeScript() function first. Thereby I wrote my own classes, Main and CommBrowser:
 
class CommBrowser extends Region {
	
	final WebView browser = new WebView();
	final WebEngine browserEngine = browser.getEngine();
	
	public CommBrowser(){
		URL markupURL = getClass().getResource("../mockup.html");
		browserEngine.load(markupURL.toExternalForm());		
		getChildren().add(browser);

                // here we go...
		browser.getEngine().executeScript("Hello()");
	}
	
	private Node createSpacer(){
		Region spacer = new Region();
		HBox.setHgrow(spacer,  Priority.ALWAYS);
		return spacer;
	}
	
	@Override protected void layoutChildren(){
		double width = getWidth();
		double height = getHeight();
		layoutInArea(browser, 0, 0, width, height, 0, HPos.LEFT, VPos.TOP);
	}
	
	@Override protected double computePrefWidth(double height){
		return 800;
	}
	
	@Override protected double computePrefHeight(double width){
		return 600;
	}
}
and Main:
public class Main extends Application {

	private Scene CommScene;
	public void start(Stage primaryStage) {
		
		primaryStage.setTitle("Cedavis CommPort");
		CommScene = new Scene(new CommBrowser(),800,600,Color.web("#666970"));
		primaryStage.setScene(CommScene);
		primaryStage.show();
	}

	public static void main(String[] args) {
		launch(args);
	}
}
So as you can see, I just separate the classes and modfied them a bit. It is as simple as it can be. The Javascript is just a small text-function, based on JQuery. Its directly written in the markup, and loaded from an external script file. It does:
function Hello(){
	
	$("#import_content").text("Hello Javascript!");
}
So just a little Hello-World functionality. Now lets hit the problem.

When I want to execute my version of this script-example, I get an exception, telling me that "the variable Hello can not be found":
 
Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
	at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:403)
	at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:47)
	at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115)
	at java.lang.Thread.run(Unknown Source)
Caused by: netscape.javascript.JSException: ReferenceError: Can't find variable: hideAll
	at com.sun.webpane.platform.WebPage.twkExecuteScript(Native Method)
	at com.sun.webpane.platform.WebPage.executeScript(WebPage.java:1438)
	at javafx.scene.web.WebEngine.executeScript(WebEngine.java:811)
	at view.CommBrowser.<init>(CommBrowser.java:28)
	at view.Main.start(Main.java:14)
	at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
	at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:206)
	at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:173)
	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
	at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
	... 1 more
Of course I can execute the function in all browsers, I can also execute it manually in the JS console in Chrome. It just does not work via Java.

But it works fine in the example based on the tutorial. So what am I doing wrong? Especially I would like to know, how I can execute local scripts, not via absolute paths, but per relative paths. It is all structured in an eclipse JavaFX project. I am using Java 1.7 and eclipse Juno. Using Javascript would be great just to manipulate the DOM. It would save a lot of Java-souce code and would be much easier for me.

Please help me!
This post has been answered by TomSchindl on Jan 10 2013
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Feb 11 2013
Added on Jan 10 2013
2 comments
1,898 views