我正在try 使用WebView将带有Google map 的HTML文件嵌入到一个JavaFX应用程序中.我用更简单的HTML文件(只有段落文本和div)测试了我的代码,它是embedded correctly,但出于某种原因,谷歌 map 不能嵌入.相反,它显示的是white rectangle with a scroll bar.

以下是我的谷歌 map 的超文本标记语言:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title> GUI Embedded Map Test </title>
  <style>
    #map{
        height:600px;
        width:100%;
    }
  </style>
</head>
<body>
  <div id="map"></div>
  <script>
    function initMap() {
      window.map = new google.maps.Map(document.getElementById("map"), {
        zoom: 15,
        center:{lat:32.99069195330653, lng:-106.97436738069189},
        mapTypeId: "terrain",
      });
    }

    window.initMap = initMap;
  </script>
  <script async defer
      src="https://maps.googleapis.com/maps/api/js?key=RANDOMKEY&callback=initMap" /c/
    ></script>
</body>
</html>

(仅供参考,如下所示为when opened in a browser)

以下是我嵌入它的Java代码:

WebView webView = new WebView();
WebEngine webEngine = webView.getEngine();
String map_html = "";
    try {
            File myObj = new File(System.getProperty("user.dir")+"/src/main/resources/embeddedMap.html");
            Scanner myReader = new Scanner(myObj);
            while (myReader.hasNextLine()) {
            map_html += myReader.nextLine();
        map_html += "\n";
            }
            myReader.close();
    } catch (FileNotFoundException e) {
            System.out.println("An error occurred.");
        e.printStackTrace();
    }
webEngine.loadContent(map_html);
mapPane.getChildren().add(webView);

我try 使用从谷歌 map 上的"共享"功能复制的iframes标签,而不是上面的html.我还try 了不同的API密钥.

如有任何帮助,将不胜感激!

推荐答案

您正在try 的操作不适用于JavaFX 18.0.1->;20,有关更多详细信息,请参阅FAQ.

Workaround

try 可用的最新版本的JavaFX,看看它是否可以工作.如果不能,那就试试JavaFX<;=18的版本(一些用户报告说,这些版本可以在谷歌 map 上运行).

确保无论您 Select 哪个版本,所有JavaFX组件的版本都是完全相同的,因为不支持混合使用JavaFX组件版本.

Official support for Google Maps display in JavaFX WebView

谷歌并未在谷歌 map 中正式支持JavaFX WebView.

此外,WebView中的Google Maps的JavaFX发行说明中也没有明确的支持保证.

这并不意味着WebView的某些版本不能在谷歌 map 上运行(老版本的JavaFX已经被证实可以在谷歌 map 上运行),只是谷歌不保证会支持JavaFX WebView.

FAQ (responses to comments by José Pereda)

GMapsFX呢?

上次我try GMapsFX时,GMapsFX也不起作用(那可能是在JavaFX 19或20上).在内部,GMapsFX依靠WebView来渲染谷歌 map .

该项目的首席开发人员在issue分中 comments :

将JavaFX 18.0.1与其升级的WebKit版本一起使用时,不会渲染任何 map .


有趣的是,它适用于我的18岁及以下版本,但从18.0.1开始确实失败了.我想知道是什么变化导致了这一点,如果是WebKit的问题,那不是谷歌不支持WebView,而是反过来?

这是一张list of clients that Google support for their JavaScript maps client API美元的.它不包括JavaFX,如果有,他们将有义务使其与受支持的JavaFX版本一起工作,但他们不包括.


老实说,我认为谷歌并不认为JavaFX WebView是需要支持的"真正的"网络浏览器.如你所知,它是一个嵌入式浏览器,基于Apple Safari Port和WebKit GTK releases,经过一些修改使其可以与Java/JavaFX一起工作.有可能这些修改之一 destruct 了对Google Maps的支持,因为只有在WebKitupdated从612.1到613.1(即在JavaFX18和18.0.1之间)之后,Google Maps才停止工作.

当我最初写这个答案的时候,我不知道问题跟踪器报告提到了在JavaFX 18和18.0.1版本之间Google Maps的崩溃.相反,我以为谷歌发布了一个与JavaFX不兼容的更新版本的谷歌 map .或许情况并非如此.

我确实看到,Google目前明确支持(至少目前)其他平台like the deprecated iOS UIWebView上的嵌入式浏览器,这些浏览器不是"真正的"浏览器,所以如果他们想显式支持JavaFX WebView(我的观点),很可能是可能的.对于JavaFX团队来说,明确支持Google Maps可能会更难,因为不知道Google是否会对他们的Maps API实现进行一些更改,使其与WebView不兼容.

Java相关问答推荐

try Dockerize Maven应用程序,但发布版本21不支持"

参数值[...]与预期类型java.util.Date不匹配

使用联接和分页的SpringBoot Spring数据JPA

在AVL树的Remove方法中使用NoSuchElementException时遇到问题

Spring @Value default无法计算表达式

我如何知道MediaDiscoverer何时完成发现介质?

将Spring Boot 3.2.0升级到3.2.1后查询执行错误

Spring Boot&;Docker:无法执行目标org.springframework.boot:spring-boot-maven-plugin:3.2.0:build-image

如何在Java中为thunk创建映射器函数

基于配置switch 的@Controller的条件摄取

如何处理两个几乎相同的XSD文件?

如何通过Java java.lang.Foreign API访问本机字节数组

在权限列表中找不到我的应用程序

为什么没有加载java.se模块?

如何在MPAndroidChart中的条形图上正确添加标签

如何正确使用java.time类?

这是JavaFX SceneBuilder的错误吗?

为什么我得到默认方法的值而不是被覆盖的方法的值?

Java中计算大n和k值模10^9+7的二项式系数的乘法公式输出错误值

在数组列表中找到对象后,未从数组中删除对象