我正在NetBeans中使用Maven创建联系人应用程序。对于程序的运行,我希望用户将图像(联系人头像)添加和存储在文件夹/ avatar中,并在侦听器事件中访问它们。我可以从ProjectRoot / src / main / resources / images目录中访问图像,但是不能访问ProjectRoot / avatars。 注意:我不想将头像存储在资源目录中,因为这些头像将在程序操作期间由用户添加。
我尝试使用getClass()。getResource(avatarPath);就像在类似问题中所建议的那样,但没有奏效。我也尝试过将“ avatars”目录添加到POM作为其自己的资源目录,但这也没有用。
使用Maven时如何访问项目根目录中的文件/文件夹?
listviewContacts.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Contact>() {
@Override
public void changed(ObservableValue<? extends Contact> observable, Contact oldValue, Contact newValue) {
String avatar = newValue.getAvatar();
String avatarPath = null;
if (avatar.isEmpty()) {
avatarPath = "/images/" + DEFAULT_AVATAR; // loads from ProjectRoot/src/main/resources/images
} else {
avatarPath = "/avatars/" + avatar; // won't load from ProjectRoot/avatars
}
try {
imageviewContact.setImage(new Image(avatarPath));
} catch (IllegalArgumentException ex) {
System.err.println("Could not locate " + avatarPath);
}
}
});
答案 0 :(得分:0)
您正在混合两种不同的东西。
您既可以将 classpath资源与类一起打包在jarfile中,也可以在将Java显式添加到java classpath中的目录中(使用java -cp命令行参数)。可以通过getClass()。getResource进行访问。
或者您可以使用java.io.File从任意位置加载文件。然后,“ projectRoot”是文件系统中的某个文件夹,您可以对其进行硬编码,通过-DprojectRoot = C:/ fun / with / files进行配置,或者使用一些相对路径。 Maven与它无关,因为化身“将在程序操作期间由用户添加”。
您的用户将不会启动您的IDE,对吗?
答案 1 :(得分:0)
问题在于了解 javafx.scene.image.Image 的不同构造函数在哪里开始。
使用Image的URL构造函数时,URL路径将从 Maven的已定义资源文件夹(/ src / main / resources 或添加到pom.xml中的任何其他资源目录)开始文件):
// the supplied string invokes the URL constructor
Image image = new Image("path/to/file");
当使用Image的InputStream构造函数(通过FileInputStream)时,该路径将从项目/应用程序的根目录开始:
// the FileInputStream invokes the InputStream constructor
Image image = new Image(new FileInputStream("path/to/file"));