2013-06-04 34 views
2

我想了解更多关于JavaFX的内容,所以我试着设置Webview。 我复制了来自Oracle网站的webview示例并添加了Upcall功能。 但它不工作。其实我不知道如何在Webview中调试网站。 因此,这里的java代码:将Javascript升级到JavaFX

package boersensim; 

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.geometry.HPos; 
import javafx.geometry.VPos; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.Priority; 
import javafx.scene.layout.Region; 
import javafx.scene.paint.Color; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 
import netscape.javascript.JSObject; 


public class Main extends Application { 
private Scene scene; 
@Override public void start(Stage stage) { 
    // create the scene 
    stage.setTitle("Web View"); 
    scene = new Scene(new Browser(),750,500, Color.web("#666970")); 
    stage.setScene(scene); 
    //scene.getStylesheets().add("webviewsample/BrowserToolbar.css"); 
    stage.show(); 
} 

public static void main(String[] args){ 
    launch(args); 
} 
} 
class Browser extends Region { 

final WebView browser = new WebView(); 
final WebEngine webEngine = browser.getEngine(); 

public Browser() { 
    //apply the styles 
    getStyleClass().add("browser"); 
    // load the web page 
    webEngine.load("test.html"); 
    //add the web view to the scene 
    getChildren().add(browser); 

    JSObject jsobj = (JSObject) webEngine.executeScript("window"); 
    jsobj.setMember("java", new Bridge()); 
} 
private Node createSpacer() { 
    Region spacer = new Region(); 
    HBox.setHgrow(spacer, Priority.ALWAYS); 
    return spacer; 
} 

@Override protected void layoutChildren() { 
    double w = getWidth(); 
    double h = getHeight(); 
    layoutInArea(browser,0,0,w,h,0, HPos.CENTER, VPos.CENTER); 
} 

@Override protected double computePrefWidth(double height) { 
    return 750; 
} 

@Override protected double computePrefHeight(double width) { 
    return 500; 
} 
} 

class Bridge { 
public void exit() { 
    //Platform.exit(); 
    System.out.print("Hello!UPCALL"); 
} 
} 

的corrosponding HTML是:

Click<a href="#" onclick="java.exit();">here</a>to exit the application 

当我点击链接没有任何反应。

谢谢你提前, 丹尼尔

回答

3

设置桥()在页面加载事件

webEngine.setJavaScriptEnabled(true); 
webEngine.getLoadWorker().stateProperty().addListener(
      new ChangeListener<Worker.State>() { 
       public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) { 
        if (newState == Worker.State.SUCCEEDED) {       
         JSObject jso = (JSObject) webEngine.executeScript("window"); 
         jso.setMember("java", new Bridge()); 
        } 

       } 
      }); 
2

我也跟着本教程中(可能是您所使用的): https://blogs.oracle.com/javafx/entry/communicating_between_javascript_and_javafx

并发现它使JVM崩溃。所以,我汇报了JavaFX的JIRA的问题,我得到了如下答复:

这是因为7U5一个要求,即从JS调用的方法是在Java中的意义,即>公共类的公共成员访问。 (这是在文章的最后评论中提到的)。在这个>特定的测试案例中,Bridge应该被声明为公共类。

该崩溃在JDK8中得到修复。现在抛出一个异常。

而且工作。

+0

如果我只在3小时前看过这个回复!我有一个静态的内部类*没有* public'修饰符,并且JVM崩溃。在课堂上增加了“public”,现在它可以工作。谢谢! – metasim