JavaFx 添加图像
Posted
技术标签:
【中文标题】JavaFx 添加图像【英文标题】:JavaFx adding images 【发布时间】:2015-08-23 12:55:26 【问题描述】:无论我如何更改它,我都会不断收到此错误。我对 JavaFX 非常陌生,并认为我会尝试一个小程序。我只是想在现场显示一张图片,但我什至无法在我的程序中加载图片。我将图像放在主包(seaapp)旁边的包(seaapp.images)中
package seaapp;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class SeaApp extends Application
@Override
public void start(Stage primaryStage)
ImageView image = new ImageView(new Image(SeaApp.class.getResourceAsStream("images/space.png")));
Pane root = new Pane();
root.getChildren().add(image);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
public static void main(String[] args)
launch(args);
这给了我这个错误:
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
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(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
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$152(LauncherImpl.java:182)
at com.sun.javafx.application.LauncherImpl$$Lambda$50/355629945.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException: Input stream must not be null
at javafx.scene.image.Image.validateInputStream(Image.java:1109)
at javafx.scene.image.Image.<init>(Image.java:694)
at seaapp.SeaApp.start(SeaApp.java:27)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(LauncherImpl.java:863)
at com.sun.javafx.application.LauncherImpl$$Lambda$53/1175241703.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl$$Lambda$46/1685538367.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$170(PlatformImpl.java:295)
at com.sun.javafx.application.PlatformImpl$$Lambda$48/435396101.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$47/485815673.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$36/1673605040.run(Unknown Source)
... 1 more
Exception running application seaapp.SeaApp
Java Result: 1
当我将图片的 URL 添加为新图片时,这可以正常工作,但是当我下载图片时,它会给我这个错误。我的 netbeans 也完全更新了。我已将链接指向我如何设置文件的屏幕截图。我错过了什么吗?
项目设置:
https://drive.google.com/file/d/0B_KZLduvxt26dE5XS1p5blE5VFE/view?usp=sharing
文件设置:
https://drive.google.com/file/d/0B_KZLduvxt26Nm1sZWROSlRMeUE/view?usp=sharing
整个项目的链接:
https://drive.google.com/file/d/0B_KZLduvxt26dXVFYlFhREFGZW8/view?usp=sharing
【问题讨论】:
它应该可以工作。你能张贴那个文件夹结构的截图(包括图片和主类)吗? 我已经添加了截图@Roland 我不熟悉netbeans如何管理资源,我使用eclipse。项目结构与文件结构不同。但是,第二个屏幕截图显示图像位于 src 的根目录。如果使用“/images/space.png”有效,你可以试试吗?一世。 e.以“/”从根目录开始路径。否则有netbeans经验的人必须介入。 不,没有区别。谢谢尝试。 @罗兰 您的屏幕截图令人困惑。两个屏幕截图都显示了图像的不同位置。第一个显示了src/seaapp/images
内部的图像,而第二个显示了src/images
内部的图像。
【参考方案1】:
在images/space.png
之前添加正斜杠/
,您的代码就可以正常工作(也就是说,如果路径正确)。
ImageView image = new ImageView(new Image(SeaApp.class.getResourceAsStream("/images/space.png")));
编辑:
它应该可以正常工作。
【讨论】:
@KelvinWong 这很奇怪。它应该工作。我在发布答案之前尝试过。检查路径;也许是不正确的。 我不知道该说什么。我正在做与您完全相同的事情,但我仍然收到 InvocationTargetException @SSJ2Gogeta【参考方案2】:这样做:
Image image = new Image( getClass().getResource( "images/space.png").toExternalForm());
ImageView image = new ImageView( image);
如果这不起作用,请找出要查找的路径:
System.out.println( "Path: " + getClass().getResource("/").toExternalForm());
System.out.println( "Path: " + getClass().getResource("images").toExternalForm());
...
并检查图像是否存在。
【讨论】:
我试过了,它不起作用,当我这样做时:'System.out.println("Path:" + getClass().getResource("images").toExternalForm()); '我得到了同样的错误,但是当我执行 'System.out.println("Path:" + getClass().getResource("/").toExternalForm());'它运行并给我:路径:文件:/C:/Users/Kelvin/Documents/NetBeansProjects/seaApp/build/classes/ 现在检查“C:/Users/Kelvin/Documents/NetBeansProjects/seaApp/build/classes/”中的文件夹结构。 space.png 到底在哪里? 它在一个名为 images 的文件夹中 所以它的完整路径是“C:/Users/Kelvin/Documents/NetBeansProjects/seaApp/build/classes/images/space.png”?然后 System.out.println("路径:" + getClass().getResource("/images/space.png").toExternalForm());必须工作。如果没有,请将整个项目放在一个 zip 文件中以供下载。 我添加了整个项目的链接。【参考方案3】:更改以下行:
ImageView image = new ImageView(new Image(SeaApp.class.getResourceAsStream("images/space.png")))
到
ImageView image = new ImageView(new Image(SeaApp.class.getResourceAsStream("file:./"+"images/space.png")))
参考:https://***.com/a/23878479/6336264
【讨论】:
【参考方案4】:将 jar 中的图像包装到 exe 中时遇到同样的问题 问题是文件名中的第一个大写字母。包装器中的路径区分大小写,但在 Windows 上的 IDE 下运行时不区分大小写。
【讨论】:
以上是关于JavaFx 添加图像的主要内容,如果未能解决你的问题,请参考以下文章
如何将图像工具提示添加到 JavaFX 中的 ComboBox 项?
javafx中如何给面板添加背景图片例如BorderPane