Java 是否通过ImageIO.read将图像添加到JPanel?
我正在尝试添加一个带有图片的JPanel。我正在使用ImageIO.read获取路径,但我得到一个IOException,它说:无法读取输入文件 这幅画叫TCHLogo。它是我项目中“res”文件夹中的PNG 如果有任何更好的方式显示此图像,请也提及它 以下是我的JPanel的代码:Java 是否通过ImageIO.read将图像添加到JPanel?,java,swing,io,jpanel,paintcomponent,Java,Swing,Io,Jpanel,Paintcomponent,我正在尝试添加一个带有图片的JPanel。我正在使用ImageIO.read获取路径,但我得到一个IOException,它说:无法读取输入文件 这幅画叫TCHLogo。它是我项目中“res”文件夹中的PNG 如果有任何更好的方式显示此图像,请也提及它 以下是我的JPanel的代码: import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOExcept
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
}
}
以下是我如何在小程序中添加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)
java.lang.IllegalArgumentException:input==null!
在javax.imageio.imageio.read(imageio.java:1338)
位于surprice.applet.ImagePanel.(ImagePanel.java:17)
位于surprice.applet.MainClass.init(MainClass.java:41)
运行(AppletPanel.java:436)
运行(Thread.java:679)
相对于用户目录,图像的文件路径可能不正确。要找出Java开始查找的位置,用户目录的位置,请在程序中的某个地方放置类似以下代码行的内容:
System.out.println(System.getProperty("user.dir"));
也许您最好将图像作为从资源获取的输入流,而不是文件。e、 g
image = ImageIO.read(getClass().getResourceAsStream("res/TCHLogo.png"));
这将在给定的相对于类文件位置的路径上查找映像,事实上,如果映像位于jar文件中,则必须这样做
编辑2另一方面,通常您需要先调用super的paintComponent方法,然后再进行任何自己的绘制,以便能够进行必要的内部维护,例如去除“脏”图像位。e、 例如,改变这一点:
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);
}
我已经编写了用于此范围的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
}
它开始在workspace/Applet/bin中查找。。也许我可以在项目的bin文件夹中创建一个文件夹。。但是当我导出这些图像时,它们也会在.jar文件中吗?@TheCompBoy:如果你把它们放在jar中,它们会在jar中。你用什么来编辑你的程序,IDE?如果有那么多人会使用向导来帮助您创建jar文件并添加选定的文件和资源。当我尝试使用您的代码行(image=ImageIO.read(getClass().getResourceAsStream(“res/TCHLogo.png”);)时,我收到以下错误消息:java.lang.IllegalArgumentException:input==null!在sun.applet.AppletPanel.run(AppletPanel.java:436)在java.lang.Thread.run(Thread.java:679)在sunprice.applet.MainClass.init(MainClass.java:41)在sun.applet.AppletPanel.run(AppletPanel.java:436)在surprice.applet.ImagePanel.ImagePanel.(ImagePanel.java:17)@TheCompBoy:相对于类文件,您的图像文件在哪里?@TheCompBoy我已经通过使用
getClass().getClassLoader().getResourceAsStream(path)
解决了类似的问题。相反,您的paintComponent实现是无效的:默认情况下,JPanel报告是不透明的,因此它保证填充每个像素。另外:它应该实现getXXSize,使LayoutManager的生活更轻松:-)