【问题标题】:Cannot Find Image找不到图片
【发布时间】:2012-04-19 10:17:43
【问题描述】:

我遇到了无法通过 Java 找到图像的问题。我和我的朋友正在做一个项目,我们做了完全相同的事情。我已经更改了图像位置的路径,甚至将图像拖放到 Eclipse 中。然而,我没有运气。这是我的代码:

import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Toolkit;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Map;

import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class MapArray {
    static JPanel[][] tiles = new JPanel[30][29];
    static String[][] images = new String[30][30];
    final static int SIZE = 30;
    static int place=0;

public MapArray(){

}

protected static ImageIcon createImageIcon(String path) {
    java.net.URL imgURL = Map.class.getResource(path);
    if (imgURL != null) {
        return new ImageIcon(imgURL);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}

public static void setMap(){

    try {
        String a = getFileContents("C:\\Users\\*****\\workspace\\Pokemon\\src\\map1.txt");
        for(int x=0; x<29; x++){
            for(int y=0; y<30; y++){
                images[x][y]=a.substring(0,a.indexOf(" "));
                a=a.substring(a.indexOf(" ")+1);
                System.out.println(images[x][y]);
            }
        }
    } catch (Exception e) {
        System.out.println("y u no work :(");
    }

}

public static String getFileContents(String fileName) throws Exception {
    File theFile = new File(fileName);
    byte[] bytes = new byte[(int) theFile.length()];
    InputStream in = new FileInputStream(theFile);
    int m = 0, n = 0;
    while (m < bytes.length) {
        n = in.read(bytes, m, bytes.length - m);
        m += n;
    }
    in.close();
    return new String(bytes); 
}

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            setMap();
            JFrame frame = new JFrame();
            frame.setLayout(new GridLayout(30, 29, 0, 0));
            for (int i = 0; i < 29; i++) {
                for (int j = 0; j < 29; j++) {
                    tiles[i][j] = new JPanel(new GridLayout());
                    tiles[i][j].add(new JLabel(
                            createImageIcon("C:\\Users\\*****\\workspace\\Pokemon\\src\\tile"+"-"+images[i][j]+".png")));
                    frame.add(tiles[i][j]);
                }
            }
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        }
    });
}


}

我尝试放入完整图像路径的所有方法都不起作用。另外,任何人都可以提供相对路径的帮助吗?我和我的朋友将在多台计算机之间共享代码,因此非专用于我们工作区所在位置的相对路径会很棒。谢谢!

【问题讨论】:

  • 您能否发布一些输出,以便我们了解什么有效和无效?
  • 找不到文件:C:\Users___\workspace\Pokemon\src\tile-24.png
  • 这只是其中的一个例子。它可以从文本文件中读取,但无法找到我 100% 位于该确切位置的图像。
  • 自从昨天工作 (stackoverflow.com/questions/10003610/…) 以来,情况有所不同 - 您是否 100% 确定您的大小写正确?
  • 问题是在我朋友的电脑上工作。图像仍然没有出现在我的身上。对我的朋友来说一切正常,但我找不到图像。

标签: java image swing


【解决方案1】:
// get resource of *your* class, instead of Java's Map.class
MapArray.class.getResource(path);
...
String a = getFileContents("map1.txt"); // local path, not absolute

将该文件放入您的src 文件夹中,位于MapArray.java 文件旁边。

src/
 |-- MapArray.java
 |-- ...
 `-- map1.txt

map1.txt 将被移动到bin 目录中,在.class 文件旁边(bin/ 默认情况下隐藏在 Eclipse 中,但这是设置类路径的位置)。稍后您还需要确保将资源文件打包到.jar

【讨论】:

  • 路径 = "map1.txt"。只是文件的基本名称,没有任何前面的目录。这意味着查看.class 文件的旁边,无论它在哪里
  • 哦,抱歉,您需要更改getFileContents(String path) 方法。在其中调用MapArray.class.getResourceAsStream(path) 并将流转换为String - here's 示例。
【解决方案2】:

有人能帮忙解决相对路径吗?

String a = getFileContents("./src/map1.txt");

【讨论】:

  • 这似乎仍然无法解决找不到图像的问题。我可以向您保证,它们位于正确的位置。我收到了确切的错误消息:“找不到文件:C:\Users\ ****\workspace\Pokemon\src\tile-24.png”并转到该位置并显示图像。
  • 你试过了吗? createImageIcon("./src/tile"+"-"+images[i][j]+".png");
  • @chicagochillin works
【解决方案3】:

您可以从一个简单的代码 sn-p 开始(我忽略导入,...因为我懒得启动我的IDE)

public static void main( String[] args ){
  File file = new File( "C:...");//with the path you use in your code
  System.out.println( file.exists() );
}

这是关于发现/调试问题所需的内容。然后就可以开始转换成相对路径了。

【讨论】:

    【解决方案4】:

    如果资源本质上是应用程序的一部分。 (嵌入式应用程序资源)而不是用于写入,它们应该添加到应用程序运行时类路径上的 Jar 中,并通过从 Class.getResource() 获得的 URL 访问。它会像这样工作:

    URL urlToMap1 = this.getClass().getResource("/src/map1.txt");
    

    您需要检查 Jar 中资源最终所在的确切路径,并从 Jar 的根目录 (/) 引用它,然后是 Jar 中的路径 (src/map1.txt)。

    【讨论】:

      猜你喜欢
      • 2013-03-27
      • 2019-05-04
      • 2012-01-12
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 2021-12-27
      相关资源
      最近更新 更多