通过将Java对象发送到javascript,将文本从javascript发送到javaFX
编辑: 在webview上添加鼠标单击和滚动的EventHandler将有助于解决此问题。我的问题是,当缩放或单击(平移)时,对象会发生变化通过将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) {
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);
}
}