2017-08-29 3 views
0

Ich habe ein Problem mit der WebEngine-Klasse in JavaFX, in dem der JavaScript-Callback scheint nur zu funktionieren.JavaFX8 JavaScript Callback via WebEngine Problem

webEngine = webView.getEngine(); 
webEngine.load(getClass().getResource("source.html").toString()); 
webEngine.setUserStyleSheetLocation(getClass().getResource("style.css").toString()); 

JSObject js = (JSObject) webEngine.executeScript("window"); 
js.setMember("app", new JavaLink()); 

public class JavaLink{ 
     public void setDrag(boolean drag) { 
      System.out.println(drag); 
     } 
    } 

habe ich den grundlegenden Code wie diese auf, mit oracle docu on WebEngine und erstellt eine HTML-Datei mit dem folgenden Teil: So

<body> 
    <div id = "block">Text</div> 

    <script> 
     document.getElementById("block").onmouseover = function() {notifyPos()}; 
     document.getElementById("block").onmouseout = function() {notifyNeg()}; 

     function notifyPos() { 
      app.setDrag(true); 
     } 

     function notifyNeg() { 
      app.setDrag(false); 
     } 
    </script> 
</body> 

, wenn ich über den „Text“ schweben würde drucken wahr oder falsch . Das Problem besteht darin, dass es nach einiger Zeit immer wieder aufhört zu funktionieren. Ich habe keine Ahnung warum, aber das Hinzufügen eines Hintergrundbildes zur HTML-Datei über CSS scheint es auf etwa zehn Callbacks zu beschränken (es scheint zeitbezogen zu sein).

EDIT

Okay, nachdem auf einem anderen PC den Code-Snippet zu testen Ich bemerkte, dass der Code überhaupt nicht funktionieren. Wenn jemand jemals ein ähnliches Problem hat, ist es das, was es fest:

Importe:

import javafx.concurrent.Worker; 
import javafx.concurrent.Worker.State; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.event.EventHandler; 

Added Code:

webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() { @Override 
       public void changed(ObservableValue<? extends Worker.State> ov, Worker.State t, Worker.State t1) { 
        if (t1 == Worker.State.SUCCEEDED) { 
         // this will be run as soon as WebView is initialized. 
         JSObject js = (JSObject) webEngine.executeScript("window"); 
         js.setMember("app", new JavaLink()); 

        } 
       } 
      }); 

ich jetzt das Problem haben, dass dieser Code auf meinem Notebook funktioniert (Same Java-Version, IDE, Addons ...), aber nicht auf meinem PC. Es funktioniert immer noch nur für ungefähr zehn Mouseovers. Weiß jemand was es sein könnte?

Antwort

0

Fixed für meinen PC, da dies offenbar nicht funktioniert hat oder wenn jemand klären will, was passiert, löscht die Garbage Collection den Link.

Der Code, den ich hinzugefügt habe, um zu beheben, war, den Link fürhand zuzuweisen.

JavaLink link = new JavaLink(); 
js.setMember("app", link);