2016-11-21 15 views
0

如何将Java(JavaFx)中的变量传递给JavaScript?我想我必须使用executeScript,但我不确定如何真正使用它。基本上我想发送元件在arraylist从Java到在JavaScript中array的程序。下面的代码是我写的Java代码。希望有人能帮助我。先谢谢你。如何将JavaFX之间的变量传递给javaScript?

import java.util.ArrayList; 
import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.VBox; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 

public class UserInterface extends Application{ 
    Button btn_js; 

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

    @Override 
    public void start(Stage stage) throws Exception { 
     WebView myWebView = new WebView(); 
     WebEngine engine = myWebView.getEngine(); 
     ArrayList<String> arr = new ArrayList<String>(); 
     btn_js = new Button("fire js"); 
     btn_js.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       //engine.executeScript("something goes here to transfer data to js"); 
     } 
     }); 
     VBox root = new VBox(); 
     root.getChildren().addAll(myWebView, btn_js); 
     Scene scene = new Scene(root, 500, 500); 
     stage.setScene(scene); 
     stage.show(); 
    } 
} 

回答

0

如您所想,您可以使用executeScript

比如,你可以写一个JavaScript函数,它传递的阵列上的东西。从Java阵列传递给JavaScript,则必须把它变换为Javascript格式(手动或通过使用JSON例如)。

下面是一个例子:

这里javascript函数被加载使用loadContent将通过传递的数组环路和将创建并为每个元素警报。在Java方面,每个警报使用setOnAlert打印。

myWebView.getEngine().executeScript("printArray(" + transformToJavascriptArray(arr) + ")")); 

其中transformToJavascriptArray将改造的Java List到Javascript数组(我手动这样做):

在一个JavaFX按下按钮,该功能被执行。

public class UserInterface extends Application { 
    Button btn_js; 

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

    @Override 
    public void start(Stage stage) throws Exception { 
     WebView myWebView = new WebView(); 

     myWebView.getEngine().loadContent("<html>\n" 
         + " <script>function printArray(arr) {" 
         + "for (i = 0; i < arr.length; i++) {" 
         + " window.alert(arr[i]);" 
         + "}" 
         + "} </script> " 
         + " </body>\n" 
         + "</html>"); 

     List<String> arr = new ArrayList<String>(); 
     arr.add("Dog"); 
     arr.add("Cat"); 

     btn_js = new Button("fire js"); 
     btn_js.setOnAction(e -> myWebView.getEngine().executeScript("printArray(" + transformToJavascriptArray(arr) + ")")); 

     myWebView.getEngine().setOnAlert(event -> System.out.println("JS alert: " + event.getData())); 

     VBox root = new VBox(); 
     root.getChildren().addAll(myWebView, btn_js); 
     Scene scene = new Scene(root, 500, 500); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    private String transformToJavascriptArray(List<String> arr) { 
     StringBuffer sb = new StringBuffer(); 
     sb.append("["); 

     for (String str : arr) 
      sb.append("\"").append(str).append("\"").append(", "); 

     if (sb.length() > 1) 
      sb.replace(sb.length() - 2, sb.length(), ""); 

     sb.append("]"); 

     return sb.toString(); 
    } 
} 
+0

谢谢DVarga。我会按照你的榜样,使我的工作方案。 – zxc34