我对javafx还是很陌生,并且在使用代码教程进行测试时得到java.lang.reflect.InvocationTargetException
:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Main extends Application {
public static final String IMAGE_NAME = "groceries.jpg";
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
Scene scene = new Scene(setupScene(), 300, 300);
primaryStage.setScene(scene);
primaryStage.setTitle("Image Screen");
primaryStage.show();
}
StackPane setupScene() {
StackPane root = new StackPane();
ImageView imageView = new ImageView();
imageView.setPreserveRatio(true);
imageView.setSmooth(true);
Image image = new Image(getClass().getClassLoader().getResource(IMAGE_NAME).toString());
imageView.setImage(image);
root.setPrefSize(250, 250);
imageView.setFitHeight(root.getPrefHeight());
imageView.setFitWidth(root.getPrefWidth());
root.getChildren().add(imageView);
return root;
}
}
该异常是由java.lang.NullPointerException
行中的Image image = new Image(getClass().getClassLoader().getResource(IMAGE_NAME).toString());
引起的
该图像文件位于我的项目文件夹中,但似乎未加载。我可以使用Image image = new Image(new File(IMAGE_NAME).toURI().toURL().toString())
来获取图像,但是当我切换回Image image = new Image(getClass().getClassLoader().getResource(IMAGE_NAME).toString())
时,它就永远无法工作。
有人知道我的程序为什么会这样吗?任何想法将不胜感激...
编辑:我的图像文件与src文件夹位于同一级别:
- projectfolder
- groceries.jpg
- src
- Main.java
我正在使用IntelliJ JavaFX Application创建项目,一切都处于默认状态。
答案 0 :(得分:0)
Image image = new Image(getClass().getClassLoader().getResource(IMAGE_NAME).toString())
和Image image = new Image(new File(IMAGE_NAME).toURI().toURL().toString())
做两件事。
第一个将基于类加载器获得资源,这是直接从jar文件中提取资源时最常使用的资源。第二个用于从文件系统加载图像,这就是为什么这种情况适用于您的情况(这就是文件所在的位置!)
答案 1 :(得分:0)
getClass()。getClassLoader()。getResource()行,在您的Main类所在的位置搜索文件。
如果src中有此映像,则只需添加'/'即可:
private String theme1Url = getClass().getResource("/groceries.jpg").toExternalForm();