Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过将Java对象发送到javascript,将文本从javascript发送到javaFX_Javascript_Json_Javafx_Webview - Fatal编程技术网

通过将Java对象发送到javascript,将文本从javascript发送到javaFX

通过将Java对象发送到javascript,将文本从javascript发送到javaFX,javascript,json,javafx,webview,Javascript,Json,Javafx,Webview,编辑: 在webview上添加鼠标单击和滚动的EventHandler将有助于解决此问题。我的问题是,当缩放或单击(平移)时,对象会发生变化 browser.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent e) {

编辑: 在webview上添加鼠标单击和滚动的EventHandler将有助于解决此问题。我的问题是,当缩放或单击(平移)时,对象会发生变化

         browser.addEventHandler(MouseEvent.MOUSE_CLICKED,
                new EventHandler<MouseEvent>() {
                    @Override public void handle(MouseEvent e) {
                    jsobj.setMember("java", new Bridge());
                    e.consume();
                    }
        });


        browser.setOnScroll(new EventHandler<ScrollEvent>() {
            @Override public void handle(ScrollEvent event) {
                jsobj.setMember("java", new Bridge());
                event.consume();
            }
        });
创建java对象并将其发送到JavaScript

JSObject jsobj = (JSObject) browser.getEngine().executeScript("window");
                        jsobj.setMember("java", new Bridge());
什么是窗口功能

编辑:

这是最简单的版本


HTML


JavaScript中
标记
变量的JSON中有一个错误:

    var marker = new google.maps.Marker({
      label: name;
      position: latlng,
      map: document.map
    });
应该是

    var marker = new google.maps.Marker({
      label: name,
      position: latlng,
      map: document.map
    });
此外,在请求web引擎加载HTML之后,您正在web引擎上注册侦听器。您无法保证在加载完成时安装侦听器(如果加载非常快,则可能会在安装侦听器之前完成,因此不会调用侦听器)。同样,在附加回调之前执行脚本。下面是您的
Main
类的一个版本,它的代码顺序更为合理(为了简单易读,我也对其进行了清理):


当您尝试执行javascript
var string=java.exit2()时,可能会发生一些不好的事情
,假定
exit2()
具有
void
返回类型。删除该行并查看它是否有用(或使
exit2()
返回
字符串
)。到底发生了什么?至于“什么是窗口函数?”:它不是一个函数,而是一个变量。例如,请参见(因此在本上下文中的javascript中,它基本上是一个表示
WebView
)的变量。@James_D注意到当调用侦听器时会发生这种情况,我添加了另一行代码,当单击标记时,地图将其类型从地形更改为路线图。所以听者工作。我删除了var string=java…行,没有错误或任何system.out.printing。当我没有返回任何内容时也没有错误。我只能建议您尝试创建一个。“从您发布的两个代码片段中诊断这个问题的可能性不大。@James_D补充道。
document.addMarker(…)
部分有语法错误。关键是,如果您创建一个新的(最小的)实际编译和运行的项目,将相关代码复制到其中,然后验证它是否编译和运行,然后将该最小项目中的所有代码复制到此处,则不会发生这种情况。我没有使用FXML,只是将您的webview代码复制到一个实际的应用程序类中,然后我就可以运行它了。仍然不起作用。帖子更新。。。ReferenceError:找不到变量:新建_york@Batty这对我来说很好。(我不知道你为什么认为从标签的值中删除引号会起作用。)但是,你的代码排序不合理:请参见编辑答案中的重新排序。James,在你滚动到地图或平移上的“放大”后,你能确认它是否仍然起作用吗?我这样做是行不通的。很抱歉重新打开这个问题。你使用的是我发布的最新代码吗?我问,因为我编辑了很多次。这里有一个链接到一个屏幕记录,我拍摄了我的问题。
package application;

import java.net.URL;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.concurrent.Worker.State;
import javafx.stage.Stage;
import netscape.javascript.JSObject;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebView;


public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root,400,400);

            WebView browser = new WebView();
            URL url = getClass().getResource("map.html");
            browser.getEngine().load(url.toExternalForm());
            root.setCenter(browser);

            browser.getEngine().getLoadWorker().stateProperty().addListener(
                    new ChangeListener<State>() {
                      @Override public void changed(ObservableValue ov, State oldState, State newState) {
                          if (newState == Worker.State.SUCCEEDED) {

                            browser.getEngine().executeScript(
                                    "document.addMarker("
                                            //lat
                                            +"40.7128"+","
                                            //long
                                            +"-74.0059"+","
                                            //marker name
                                            +"'"+"new_york"+"'"
                                            +")"
                                    );  

                            JSObject jsobj = (JSObject) browser.getEngine().executeScript("window");
                            jsobj.setMember("java", new Bridge());
                          }

                    }
             });

            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public class Bridge{
        public void exit2() {
            System.out.println("test");
        }
    }
    public static void main(String[] args) {
        launch(args);
    }
}
Exception in thread "JavaFX Application Thread" netscape.javascript.JSException: ReferenceError: Can't find variable: new_york
    at com.sun.webkit.dom.JSObject.fwkMakeException(JSObject.java:137)
    at com.sun.webkit.WebPage.twkExecuteScript(Native Method)
    at com.sun.webkit.WebPage.executeScript(WebPage.java:1473)
    at javafx.scene.web.WebEngine.executeScript(WebEngine.java:982)
    at application.Main$1.changed(Main.java:34)
    at application.Main$1.changed(Main.java:1)
    at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:182)
    at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
    at javafx.beans.property.ReadOnlyObjectPropertyBase.fireValueChangedEvent(ReadOnlyObjectPropertyBase.java:74)
    at javafx.beans.property.ReadOnlyObjectWrapper.fireValueChangedEvent(ReadOnlyObjectWrapper.java:102)
    at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:112)
    at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:146)
    at javafx.scene.web.WebEngine$LoadWorker.updateState(WebEngine.java:1260)
    at javafx.scene.web.WebEngine$LoadWorker.dispatchLoadEvent(WebEngine.java:1371)
    at javafx.scene.web.WebEngine$LoadWorker.access$1200(WebEngine.java:1253)
    at javafx.scene.web.WebEngine$PageLoadListener.dispatchLoadEvent(WebEngine.java:1240)
    at com.sun.webkit.WebPage.fireLoadEvent(WebPage.java:2434)
    at com.sun.webkit.WebPage.fwkFireLoadEvent(WebPage.java:2278)
    at com.sun.webkit.network.URLLoader.twkDidFinishLoading(Native Method)
    at com.sun.webkit.network.URLLoader.notifyDidFinishLoading(URLLoader.java:844)
    at com.sun.webkit.network.URLLoader.lambda$didFinishLoading$99(URLLoader.java:835)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Unknown Source)
    var marker = new google.maps.Marker({
      label: name;
      position: latlng,
      map: document.map
    });
    var marker = new google.maps.Marker({
      label: name,
      position: latlng,
      map: document.map
    });
package application ;

import java.net.URL;

import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;


public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root,400,400);

            WebView browser = new WebView();
            root.setCenter(browser);

            browser.getEngine().getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> {
                  if (newState == Worker.State.SUCCEEDED) {

                      JSObject jsobj = (JSObject) browser.getEngine().executeScript("window");
                      jsobj.setMember("java", new Bridge());

                      // document.addMarker(latitude, longitude, markerName) :
                      String script = "document.addMarker(40.7128, -74.0059, 'new_york')";

                      browser.getEngine().executeScript(script);  

                  }
            });

            URL url = getClass().getResource("map.html");
            browser.getEngine().load(url.toExternalForm());

            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public class Bridge{
        public void exit2() {
            System.out.println("test");
        }
    }
    public static void main(String[] args) {
        launch(args);
    }
}