【问题标题】:BlueJ Image Not Found未找到 BlueJ 图像
【发布时间】:2017-05-18 20:42:36
【问题描述】:

我有一个 JavaFX BlueJ 项目。以下是简单的目录结构

如您所见,我在同一目录中有 Gui.java 和 map.png 文件。以下是我的代码

@Override
public void start(Stage primaryStage) throws Exception {

    primaryStage.setTitle("Dragon Castle");

    Game game = new Game();
    TextArea logArea = new TextArea();

    VBox vbox = new VBox(10);

    // Create maps

    Canvas canvas = new Canvas(770, 630);

    Image map = new Image("map.png"); // Here it is giving error

    GraphicsContext gc = canvas.getGraphicsContext2D();

    // Insert controls

    VBox controlsVbox = new VBox(5);
    controlsVbox.setAlignment(Pos.CENTER);

    HBox buttonHboxR1 = new HBox(5);
    buttonHboxR1.setAlignment(Pos.CENTER); .... Other code

错误:

Exception in Application start method
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$152(LauncherImpl.java:182)
    at com.sun.javafx.application.LauncherImpl$$Lambda$7/22058848.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found
    at javafx.scene.image.Image.validateUrl(Image.java:1099)
    at javafx.scene.image.Image.<init>(Image.java:608)
    at src.Gui.start(Gui.java:46)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(LauncherImpl.java:863)
    at com.sun.javafx.application.LauncherImpl$$Lambda$57/5668924.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl$$Lambda$53/812813.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$170(PlatformImpl.java:295)
    at com.sun.javafx.application.PlatformImpl$$Lambda$55/19277439.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(PlatformImpl.java:294)
    at com.sun.javafx.application.PlatformImpl$$Lambda$54/26973244.run(Unknown Source)
    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$145(WinApplication.java:101)
    at com.sun.glass.ui.win.WinApplication$$Lambda$43/21354624.run(Unknown Source)
    ... 1 more
Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
    at javafx.scene.image.Image.validateUrl(Image.java:1091)
    ... 16 more

找不到图片。我在eclipse中尝试了相同的代码,它的工作。我也将map.png 放在资源文件夹中,但它仍然无法在 BlueJ 中工作。

【问题讨论】:

    标签: java javafx bluej


    【解决方案1】:

    来自Image documentation:

    URL 支持的所有 URL 都可以传递给构造函数。如果 传递的字符串不是有效的 URL,而是路径,图像是 在这种情况下在类路径上搜索。

    因此,由于您传递了一个简单的路径,Image 构造函数将尝试相对于类路径解析该路径。查看堆栈跟踪,您的 Gui 类似乎在一个名为 src 的包中(真的???)并且您的图像在同一个包中。因此图像的路径应该是src/map.png。

    从与当前类相同的包中检索图像的更好方法是从类对象中获取 URL 作为资源:

    Image map = new Image(getClass().getResource("map.png").toExternalForm());
    

    【讨论】:

    • 如果这仍然给您错误,您应该检查构建文件夹(而不是源文件夹)实际上是否包含预期位置的图像。我不了解 BlueJ,所以我不知道您将如何配置它。
    • 我试过你的代码。它不工作。在bin 文件夹(所有类文件)和map.png 都在那里。
    • @Junaid 所以在bin 你有src/Gui.class 和src/map.png?我不明白为什么您的屏幕截图中的同一文件夹中有.java 文件和.class 文件。
    • 嗯,是的,实际上 BlueJ 将 eclipse javaFx 项目转换为这个项目。
    • System.out.println(getClass().getResource("Gui.class")); 给你什么? (我假设您发布的代码位于Gui.java...)
    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2013-04-30
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 2020-10-15
    相关资源
    最近更新 更多