2017-01-08 14 views
0

次のコードはLinuxでも動作しますが、Windows(VirtualBox VM)ではコールバックが機能しません。なぜ教えてもらえますか?WebView JavaScript(Windows(VirtualBox))からJavaFXを呼び出せません

のJava:

public class WebViewTest extends Application { 
     private Label label = new Label ("..."); 
     public static void main (String[] args) { 
     launch (args); 
     } 
     @Override 
     public void start (Stage stage) throws Exception { 
     WebView webView = new WebView(); 
     WebEngine webEngine = webView.getEngine(); 
     webEngine.setJavaScriptEnabled (true); 
     JSObject window = (JSObject) webView.getEngine().executeScript ("window"); 
     window.setMember ("java", new Callback()); 
     webEngine.load (getClass().getResource ("WebViewTest.html").toString()); 
     BorderPane pane = new BorderPane(); 
     pane.setCenter (webView); 
     pane.setBottom (label); 
     Scene scene = new Scene (pane); 
     stage.setScene (scene); 
     stage.show(); 
     } 
     public class Callback { 
     public void click() { 
     label.setText ("Clicked :-)"); 
     } 
    } 
    } 

HTML:

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Test</title> 
    <meta charset="UTF-8"> 
    </head> 
    <body> 
    <button onclick="window.java.click();">Test</button> 
    </body> 
</html> 
+0

あなたは[Firebug](http://stackoverflow.com/questions/29534763/javafx-and-firebug-lite-in-web-page-inspector-mode)で何が起こるか調べたことがありますか? )? – hotzst

+0

JavaFX WebViewでFirebugを使用する方法がわかりません。しかし、いくつかのデバッグの後、 'window.java'はWindows上で' undefined'という値を持ちます。 – Patrick

+0

私のコメントのリンクは、JavaFX WebviewでFirebugを使用する方法を教えてくれます。 – hotzst

答えて

0

windowオブジェクトはおそらく新しいDOMはWebエンジンにロードされたときに置き換えられます。文書がロードされたときにコールバックを設定してみてください:

Callback callback = new Callback(); 
webEngine.documentProperty().addListener((obs, oldDoc, newDoc) -> { 
    if (newDoc != null) { 
     JSObject window = (JSObject) webView.getEngine().executeScript ("window"); 
     window.setMember ("java", callback);     
    } 
}); 

3

トリックを作成することでした(あなたは、ドキュメントリスナーでHTMLをロードし、System.out.println(System.identityHashCode(window))System.out.println(System.identityHashCode(webView.getEngine().executeScript ("window"))によってwindowオブジェクトの変更があることがわかります。)

private Callback callback = new Callback(); 

そして:クラスのフィールドとしてコールバック

webEngine.load (getClass().getResource ("WebViewTest.html").toString()); 
JSObject window = (JSObject) webView.getEngine().executeScript ("window"); 
// BUG // window.setMember ("java", new Callback()); 
window.setMember ("java", callback); 

多分、Windows上に不正なガベージコレクションがありますか?私は知らない...

+1

'window.setMember(...)'が(WeakHashMapを介して)弱参照を使ってコールバックを格納している可能性があります。これは起こりそうにないと思う。 –

関連する問題