代码之家  ›  专栏  ›  技术社区  ›  Dubi

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

  •  0
  • Dubi  · 技术社区  · 6 年前

    我有一个包含许多包的JavaFX项目。我想创建一个包含所有图标的文件夹。图标路径是:src/icon/test.png,我尝试初始化图像的类是:src/project/menus/ressources/settings/SettingWindow.java。 我的问题是,我无法进入根文件夹,进入图标文件夹。

    这是我的设置窗口源:

    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;
        }
    
    
    }
    

    “file:/icon/test.png”不是我唯一尝试过的。我在某个地方找到了一个用get root()获取根目录的解决方案,但是我不能使用这个方法。 我不能使用文件夹的绝对路径,因为它计划在不同的PC上使用此软件

    2 回复  |  直到 6 年前
        1
  •  0
  •   KevinO    6 年前

    根据我的经验,寻找资源最灵活的方法是使用 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进行编码有点灵活。

        2
  •  0
  •   fabian    6 年前

    不要期望源目录在运行时可用,就像它们在构建程序之前一样。

    jar 文件。jar文件的内容无法通过文件系统访问。相反,你应该使用 Class.getResource Image 构造器。(这仅在资源通过类路径可用时有效,但如果它们可用,则不管它们是否打包在jar中都有效):

    Image icon = new Image(SettingWindow.class.getResource("/icon/test.png").toExternalForm(),
                           25, 25, false, false);