3

我正在尝试添加一个带有图片的JPanel。我正在使用 ImageIO.read 来获取路径,但我得到一个 IOException 说:无法读取输入文件

图片被称为 TCHLogo。这是我项目中“res”文件夹中的PNG。

如果有任何更好的显示此图像的方法,请同时提及!

这是我的 JPanel 的代码:

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class ImagePanel extends JPanel{

    private BufferedImage image;

    public ImagePanel() {
        try {                
           //THIS LINE BELLOW WAS ADDED
           image = ImageIO.read(getClass().getResourceAsStream("res/TCHLogo.png"));
        } catch (IOException ex) {
             // handle exception...
            System.out.println(ex);
        }
     }

     @Override
     public void paintComponent(Graphics g) {
         super.paintComponent(g);  //THIS LINE WAS ADDED
         g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters
     }

}

这是我在 Applet 中添加 JPanel 的方法:

ImagePanel appletRunningPanel;
appletRunningPanel = new ImagePanel();
appletRunningPanel.setSize(300, 300);
appletRunningPanel.validate();
add(appletRunningPanel);

编辑我在应用程序当前开始查看的 bin 内创建了一个文件夹.. 该文件夹称为 res 并且图片在里面..

现在,当我运行该行时,我得到以下 IOException:

image = ImageIO.read(getClass().getResourceAsStream("res/TCHLogo.png"));

这是错误日志:

java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(ImageIO.java:1338)
    at surprice.applet.ImagePanel.<init>(ImagePanel.java:17)
    at surprice.applet.MainClass.init(MainClass.java:41)
    at sun.applet.AppletPanel.run(AppletPanel.java:436)
    at java.lang.Thread.run(Thread.java:679)
4

2 回答 2

4

相对于用户目录,您的图像文件路径可能不正确。要找出 Java 开始查找的位置,用户目录的位置,请在程序中的某处放置类似这行代码的内容:

System.out.println(System.getProperty("user.dir"));

也许您最好将图像作为从资源而不是文件获取的 InputStream 获取。例如,

image = ImageIO.read(getClass().getResourceAsStream("res/TCHLogo.png"));

这将在相对于类文件位置给定的路径中查找图像,事实上,如果您的图像位于 jar 文件中,这就是您必须执行的操作。

编辑 2
顺便说一句,在进行任何自己的绘图之前,您通常需要先调用 super 的 paintComponent 方法,以便可以完成必要的内务处理,例如去除“脏”图像位。例如,改变这个:

 public void paintComponent(Graphics g) {
     g.drawImage(image, 0, 0, null); 
 }

对此:

 public void paintComponent(Graphics g) {
     super.paintComponent(g); // **** added****
     g.drawImage(image, 0, 0, null); 
 }
于 2011-11-13T20:27:58.007 回答
2

我已经编写了用于此范围的 ImagePanel 类:

public class ImagePanel extends JPanel {

    private static final long serialVersionUID = 7952119619331504986L;
    private BufferedImage image;

    public ImagePanel() { }

    public ImagePanel(String resName) throws IOException {
        loadFromResource(resName);
    }

    public ImagePanel(BufferedImage image) {
        this.image = image;
     }

    @Override
    public void paintComponent(Graphics g) {
        g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters

    }

    public BufferedImage getImage() {
        return image;
    }

    public void setImage(BufferedImage image) {
        this.image = image;
    }

    /**
     * Load the Image from a File
     * @param path image name and path
     * @throws IOException
     */
    public void loadFromFile(String path) throws IOException {
        image = ImageIO.read(new java.io.File(path));
    }

    /**
     * Load Image from resource item
     * @param resName name of the resource (e.g. : image.png)
     * @throws IOException
     */
    public void loadFromResource(String resName) throws IOException { 
        URL url = this.getClass().getResource(resName);
        BufferedImage img = ImageIO.read(url);

        image = img;
    }
}

然后我以这种方式使用 ImagePanel:

 //Inizialization of the ImagePanel
 ImagePanel panelImage = new ImagePanel();
//Try loading image into the image panel
        try {
            panelImage.loadFromResource("/Resources/someimage.png");
        } catch (java.io.IOException e) {
                //Handling Exception
        }
于 2011-11-13T20:41:40.190 回答