上面许多目录中的Java源代码

时间:2018-10-19 23:08:32

标签: java image file javafx directory

我有一个包含许多软件包的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上使用此软件

2 个答案:

答案 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);