我有一个包含许多软件包的JavaFX项目。我想创建一个包含所有图标的文件夹。图标路径是:src / icon / test.png,而我尝试初始化图像的类是:src / project / menus / ressources / settings / SettingWindow.java。 我的问题是,我无法进入根文件夹,进入图标文件夹。
这是我的SettingWindow来源:
package project.menus.ressources.settings;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
public class SettingWindow{
@FXML private TextField nameTF;
@FXML private Button pinButton;
private Stage stage;
public void setStage(Stage stage) {
this.stage = stage;
/*-----------------Here where i try to initialize the Image -------------*/
Image icon = new Image("file: /icon/test.png", 25,25, false, false);
pinButton.setGraphic(new ImageView(icon));
}
/*-----------------------------------------------------------------------*/
public TextField getNameField() {
return this.nameTF;
}
}
“文件:/icon/test.png”不是我尝试的唯一方法。我在某处找到了使用getRoot()获取根目录的解决方案,但我无法使用此方法。 我不能使用AbsolutPath到该文件夹,因为它计划在其他PC上使用此软件
答案 0 :(得分:0)
根据我的经验,查找资源最灵活的方法是使用InputStream
并允许类加载器查找对象。因此,基于以下声明:资源(图像)位于src
文件夹中,并假定已将所述src
文件夹完全添加到类路径中,那么类似以下的内容可能会起作用。>
注意:我假设.setGraphic(new ImageView(icon))
是正确的-我对JavaFX不太熟悉。
private void loadAndDisplayImage(Button btn) {
final String name = "icon/test.png";
ClassLoader cl = this.getClass().getClassLoader();
//
// use the try with resources, and allow the classloader to find the resource
// on the classpath, and return the input stream
//
try (InputStream is = cl.getResourceAsStream(name)) {
// the javafx Image accepts an inputstream, with width, height, ratio, smoot
Image icon = new Image(is, 25, 25, false, false);
// should probably ensure icon is not null, but presumably if the resource
// was found, it is loaded properly, so OK to set the image
btn.setGraphic(new ImageView(icon));
}
catch (IOException e) {
e.printStackTrace();
}
}
然后从loadAndDisplayImage(pinButton);
调用setStage(...)
我认为这种方法比尝试对URL进行编码更灵活。
答案 1 :(得分:0)
不要期望源目录在运行时具有与构建程序之前相同的方式。
通常,编译结果会与资源一起压缩到jar
文件中。无法通过文件系统访问jar文件的内容。相反,您应该使用Class.getResource
获取资源的url,并将其传递给Image
构造函数。 (这仅在资源通过类路径可用时才有效,但是如果资源可用,则无论它们是否装在罐子中都可以使用):
Image icon = new Image(SettingWindow.class.getResource("/icon/test.png").toExternalForm(),
25, 25, false, false);