Добавление изображения в JPanel через ImageIO.read? - PullRequest
3 голосов
/ 14 ноября 2011

Я пытаюсь добавить JPanel с изображением в нем. Я использую ImageIO.read, чтобы получить путь, но я получаю IOException, говоря: не могу прочитать входной файл

Картина называется TCHLogo. Это PNG внутри папки res внутри моего проекта.

Если есть лучший способ показать это изображение, пожалуйста, укажите это!

Вот код для моей 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
     }

}

Вот как я могу добавить JPanel в мой апплет:

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

EDIT Я создал папку внутри корзины, в которой приложение начинает искать в настоящее время .. папка называется 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)

Ответы [ 2 ]

4 голосов
/ 14 ноября 2011

Вероятно, путь к файлу вашего изображения не верен относительно пользовательского каталога.Чтобы узнать, где Java начинает искать, где находится каталог пользователя, поместите что-то вроде этой строки кода где-нибудь в вашей программе:

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

Возможно, вам лучше получить изображение в качестве InputStreamполученный из ресурса, а не в виде файла.например,

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

Это будет искать изображение по указанному пути относительно местоположения файлов класса, и на самом деле это то, что вы должны сделать, если ваше изображение находитсяв вашем jar-файле.

Редактировать 2
Кроме того, часто вам необходимо сначала вызвать метод 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); 
 }
2 голосов
/ 14 ноября 2011

Я написал этот класс 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
        }
...