2016-04-13 5 views
2

Ich frage mich, diesen Code-Schnipsel Ich verwende:Bezieht sich die Methode executeScript ("window") von JavaFX8 WebEngine auf das JavaScript-Fensterobjekt?

WebView webView = new WebView(); 
JSObject jsobj; 
webEngine = webView.getEngine(); 
try { 
    webEngine.load(getClass().getResource("index.html").toExternalForm()); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
try { 
    jsobj = (JSObject) webEngine.executeScript("window"); 
    jsobj.setMember("java", new DataModel()); 
} catch (Exception e) { 
    e.printStackTrace() 
} 

Diese Zeile webEngine.load(getClass().getResource("index.html").toExternalForm()); Lasten meine index.html in die WebView. Da es sich um eine Einzelseitenanwendung handelt, ist das alles, was ich brauche, und es gibt keine weiteren Fragen dazu.

Nun zurück auf die Frage im Titel zu erhalten:
Ist diese Zeile: jsobj = (JSObject) webEngine.executeScript("window"); stellen Sie den JSObject Bezug auf die "window object" as it's defined by w3school?
Bedeutet, dass jsobj nun gleich dem Fensterobjekt ist, dass das geöffnete Fenster im Browser darstellt?

Ist dies wahrscheinlich der Grund, warum meine Anwendung nicht funktioniert, wenn ich "Reload-Seite" über das Kontextmenü in der WebView verwenden, da es eine neue window object generieren würde?

Bonus Frage: In meinem JavaScript kann ich das Modell mit java.methodName(); zugreifen ist "Java" hier eine Kennung oder wie würde ich es nennen? Es ist nicht genau eine Instanz, also würde ich es nicht so nennen.

Edit: Das ist meine Java-Klasse:

public class DataModel{ 
    public void alert(String msg) { 
     System.out.println(msg); 
    } 
} 

Von meinem JavaScript, das in index.html eingebettet ist, ich java.alert("hello world");hello world drucken aufrufen können. Da ich die Modellreferenz an die window object übergebe, hat jede Funktion in meinem JavaScript Zugriff auf die DataModel.class. Aus der Sicht von JavaScript: Ist "Java". ein Bezeichner, eine Referenz, eine Instanz, ...?

Antwort

3

Nach this site, webEngine.executeScript("window")würde in der Tat das JavaScript Window-Objekt zurückgeben. Es gibt auch eine ganze Reihe anderer Code-Snippet-Goodies, die man sich anschauen kann!

java In diesem Fall ist ein Handler, der von Ihrem JavaScript innerhalb des Window-Objekts verwendet werden kann. So kann Ihr JavaScript beim Zugriff auf java auf das Objekt DataModel zugreifen.

Auch möchten Sie normalerweise Ihre Seite mit location.reload() in JavaScript aktualisieren.

Wenn Sie den Status zwischen dem erneuten Laden speichern möchten, sollten Sie den aktuellen HTML-Code erfassen und dann die WebView-Datei loadContent functionality verwenden, wenn das erneute Laden abgeschlossen ist. Sie können auch das WebView-Dokument abrufen, sodass Sie Knoten auf jeder Ebene direkt ändern können.

+0

Redigierte den ursprünglichen Beitrag, danke für Ihre Hilfe! :) –

+0

Der beste Weg, es zu beschreiben, ist, dass Java eine Referenz auf eine Instanz der DataModel-Klasse ist, die, wenn sie über JavaScript aufgerufen wird, JavaFX durchtunnelt, um die Klasseninstanz im Speicher zu manipulieren (und somit alert zusammen mit der von Ihnen angegebenen Nachricht aufzurufen). Überprüfen Sie mit dem Link, den ich zur Verfügung gestellt habe, den Abschnitt "Making UpCalls von JavaScript zu JavaFX". –

+0

Dies beantwortet alles, was ich gefragt habe, danke –

Verwandte Themen