2017-01-14 4 views
-1

Ich habe noch nie mit JavaFX gearbeitet, aber jetzt muss ich eine kleine Anwendung schreiben, die den Browser einbetten wird und ich muss einige Daten an den Browser übergeben und einige Daten vom Browser zurückholen. Wie ich gelesen habe brauche ich JavaScript als eine Brücke zum Austauschen der Daten. Ich habe viele Beispiele wie diese versucht:JAVA FX + Javascript

http://knowles.co.za/javafx-and-javascript-calling-java-from-javascript/

http://www.java2s.com/Code/Java/JavaFX/WebEngineLoadListener.htm

aber ich kann nichts funktioniert.

Kann mir jemand ein Arbeitsbeispiel geben?

+1

"Ich bin nicht in der Lage, etwas zu arbeiten". Versuchen Sie ein sehr einfaches Beispiel, und veröffentlichen Sie das vollständige Beispiel hier, erklären Sie, was Sie denken, dass es tun soll und was es tut, das anders ist. Einfach zu sagen, dass etwas nicht funktioniert, ist keine ausreichende Beschreibung eines Problems, für das jemand helfen könnte. –

Antwort

3

Ich glaube, Sie sind über Interaktion zwischen JavaFX einem JavaScript

zunächst dieser Operation gefragt wird ausgeführt durch Nashorn Motor

lassen Sie sich ein einfaches Beispiel verstehen und seinen vollständigen Code schreiben:

Ein Problem: Wir wollen die Summe zweier Zahlen mit javafx, JS und html

supp ose, die wir HTML haben mit

  1. zwei Eingabefelder Werte vom Benutzer
  2. Taste zu nehmen, die die Summe der Zahlen auf den Feldern
  3. div in dem wir die Summe der Zahlen Vorschau berechnen

wenn Benutzer klicken sie auf die Schaltfläche ruft es eine JavaScript-Funktion, die eine Java-Methode aufruft, die (dh: java-Methode)

die beiden Zahlen und gibt die Summe erhält

ist ein so lassen schaffen Java-Klasse, die eine Methode hat, die die Summe von zwei Zahlen berechnet, es ist so einfach

public class Adder{ 

public double getSum(String a, String b) 
{ 
    return Double.parseDouble(b) + Double.parseDouble(a); 
}} 

so müssen wir (injizieren) ein Java-Objekt an die Javascript geben, damit wir es verwenden können Methoden aufrufen, so wie man injizieren Sie ein Java-Objekt in die JS? einfach den folgenden Code

WebView browser = new WebView(); 
    browser.getEngine().getLoadWorker() 
      .stateProperty() 
      .addListener((obs, old, neww) -> 
      { 
       if (neww == Worker.State.SUCCEEDED) 
       { 
        JSObject jsobj = (JSObject) browser.getEngine() 
          .executeScript("window"); 
        jsobj.setMember("adder", new Adder()); 
       } 
      }); 

wir ein Java-Objekt (neu Adder()) in der letzten Zeile injizieren und wir geben es einen Namen (Addierer) in dem Java-Script-Code verwendet werden, so dass die Frage jetzt Wie benutzt man den Addierer im JavaScript?

betrachten Sie das folgende JavaScript-Funktion und es

function add() 
     { 
      var sum = adder.getSum("5", "7"); 
     } 

hinzufügen nennen, wie wir sehen, es ist sehr einfach nur nennen wir das übergebene (injiziert) Java-Objekt (Adder Objekt), sondern den Namen Addierer und ruft die Methode getSum ("5", "7")

jetzt lassen Sie sich einen kompletten Code hat

1- neues JavaFX-Projekt in Ihren IDE erstellen und die Hauptklasse NashornTest benannt und hier ist der Code

import javafx.application.Application; 
import javafx.concurrent.Worker; 
import javafx.scene.Scene; 
import javafx.scene.layout.VBox; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 
import netscape.javascript.JSObject; 
public class NashornTest extends Application{ 

@Override 

public void start(Stage stage) 
{ 

    //create an embeded web browser 
    WebView browser = new WebView(); 

    browser.getEngine().getLoadWorker() 
      .stateProperty() 
      .addListener((obs, old, neww) -> 
      { 
       if (neww == Worker.State.SUCCEEDED) 
       { 
        // Let JavaScript make calls to adder object, 
        //so we need to inject an [Adder] object into the JS code 
        JSObject bridge = (JSObject) browser.getEngine() 
          .executeScript("window"); 
        bridge.setMember("adder", new Adder()); 
       } 
      }); 
    //load the html page 
    browser.getEngine().load(NashornTest.class.getResource("index.xhtml").toString()); 
    VBox box = new VBox(browser); 

    Scene scene = new Scene(box); 
    stage.setScene(scene); 
    stage.show(); 
} 

public static void main(String[] args) 
{ 
    launch(args); 
}} 

eine Java-Klasse 2 erstellen und nannte es Adder, und hier ist der Code

public class Adder{ 

public double getSum(String a, String b) 
{ 
    return Double.parseDouble(b) + Double.parseDouble(a); 
}} 

eine XHTML-Datei 3 erstellen und es index.xhtml nennen und hier ist die Skripte, muss es in den gleichen sein Java-Paket der NashornTest.java

<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
     <title>TODO supply a title</title> 
 
     <meta name="viewport" content="width=device-width, initial-scale=1.0"/> 
 
     <script> 
 
      function add() 
 
      { 
 
       var num1 = document.getElementById("num1Field").value; 
 
       var num2 = document.getElementById("num2Field").value; 
 
       //make calls for injected java object 
 
       var sum = adder.getSum(num1, num2); 
 
       document.getElementById("outputDiv").innerHTML = "sum = " + sum; 
 
      } 
 

 
     </script> 
 
    </head> 
 
    <body> 
 
     <input id="num1Field"/> 
 
     <input id="num2Field"/> 
 
     <button onclick="add()">sum</button> 
 
     <div id="outputDiv"></div> 
 
    </body> 
 
</html>

am Ende ist dies eine einfache Start für die Interaktion zwischen Java und JavaScript, und ich hoffe, dieser Beitrag ist hilfreich und nützlich

+0

Danke, erstaunliches Beispiel. Noch eine Frage - wie soll ich die Funktion adder.getSum (num1, num2) von AngularJS definieren? es sagt, dass Addierer nicht definiert sind. – Purmarili

+0

Entschuldigung Bro, ich nie behandeln mit AngularJS, – Anas

+0

und ich schlage vor, Sie mischen normalen Js-Code im Umgang mit Java aber ich habe javafx mit JQuery und sie funktionierte gut – Anas