使用java显示地图的问题

时间:2017-06-30 14:02:53

标签: java svg webview

我目前正在尝试制作类似风险的游戏,当我尝试显示地图(矢量图像)时,我有一个NullPointerException,我完全不明白它是如何解决的。 = / 这是代码:

public class Test1 extends Stage {

    private BorderPane root = new BorderPane();

    private WebView browser = new WebView();

    public Test1(){
        this.setTitle("Test1");
        this.setScene(new Scene(content()));
    }

    Parent content(){
        WebEngine webEngine = browser.getEngine();
        webEngine.load(this.getClass().getResource("../../resources/worldMap.html").toExternalForm());

        root.setCenter(browser);
        return root;
    }
}

和错误:

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
    at hmi.Test1.content(Test1.java:23)
    at hmi.Test1.<init>(Test1.java:18)
    at Main.start(Main.java:13)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    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)
    ... 1 more
Exception running application Main

所以它似乎是由链接“../../resources/worldMap.html”引起的,但它确实导致了文件。我也试过svg文件或url(这一个:https://upload.wikimedia.org/wikipedia/commons/8/80/World_map_-_low_resolution.svg) 我仍然有完全相同的错误。 尽管我在互联网上进行了研究,但这是我坚持的一天,所以我希望你能够帮助我。 谢谢!

3 个答案:

答案 0 :(得分:0)

我不能肯定地说粘贴的代码,但我想我可以帮你调试它。您已在其中一条评论中将webEngine.load(this.getClass().getResource("../../resources/worldMap.html").toExternalForm());标识为错误行。

NPE表示您在该行中使用的某个内容以意外方式为空。您使用带调试器的IDE吗?在该行上设置断点并评估每个子组件。

如果没有,你真的应该尝试一下。我使用intellij并发现它使我更加有效和高效。在此期间, hackiest 最简单的解决方法是使用一堆打印语句

System.out.println("webEngine" + webEngine);
System.out.println("class" + this.getClass());
System.out.println("resource" + this.getClass().getResource("../../resources/worldMap.html"));
System.out.println("loaded" + webEngine.load(this.getClass().getResource("../../resources/worldMap.html"));

其中一个将为null,下一行将抛出一个NPE。这样,您就会知道堆栈中的哪个位置存在问题。请在发现时回复。我猜想使用this.getClass.getResource是错误的,或者您认为相对路径从路径字符串开始的位置是错误的(通常它相对于您的.class路径的写入位置)。

答案 1 :(得分:0)

您是否尝试过使用绝对路径来加载资源?您认为代码执行的位置和实际执行的位置可能不同。

答案 2 :(得分:0)

好的,我终于找到了答案。 我的问题实际上是Class.getResource() returns null

的副本

答案是图像必须与我应用“getclass”的类所在的包位于同一目录中,而它位于项目的根目录中。

感谢您的帮助!