I want to add an image to a frame but I am not able to understand where I should keep the image file and how should I give the path of the image?

I have placed an image in My Document folder and given that path but it gave an error message.

I have the following code.

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.*; 
import javax.imageio.ImageIO; 
import javax.swing.*;   

public class Test extends JPanel {
    BufferedImage image;

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

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // Draw image centered.
        int x = (getWidth() - image.getWidth())/2;
        int y = (getHeight() - image.getHeight())/2;
        g.drawImage(image, x, y, this);
    }

    public static void main(String[] args) throws IOException {
        String path = "images.jpeg";
        BufferedImage image = ImageIO.read(new File(path));
        Test contentPane = new Test(image);
        // You'll want to be sure this component is opaque
        // since it is required for contentPanes. Some
        // LAFs may use non-opaque components.
        contentPane.setOpaque(true);
        contentPane.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(5,5,5,5);
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        // Add components.
        for(int j = 0; j < 8; j++) {
            gbc.gridwidth = ((j+1)%2 == 0) ? GridBagConstraints.REMAINDER
                                           : GridBagConstraints.RELATIVE;
            contentPane.add(new JButton("button " + (j+1)), gbc);
        }
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(contentPane);
        f.setSize(400,400);
        f.setLocation(200,200);
        f.setVisible(true);
    } }
有帮助吗?

解决方案

where should I keep the image file ..

Since it seems like an 'application resource', I'd say put it on the run-time class-path of the app. That would usually be achieved by adding it (to a directory e.g. images) in a Jar.

..and how should I give the path of the image?

Access it via an URL obtained from:

URL urlToImage = this.getClass().getResource("/images/the.png");

ImageIO.read() can also accept URL or even more versatile, InputStream.

其他提示

There are few places for your image.

  • relative path, in your example the started application look up the image in folder there you start it(please check there the application was started). You can create folder "resources" for image and access via "resources\\images.jpeg"

  • absolute path, something like "C:\\Documents and settings\\<username>\\My Documents\\images.jpeg"

  • classpath - put the image in same folder/package there are your Test class is placed. This resource can be packed to .jar file.

    BufferedImage image = ImageIO.read(Test.class.getResourceAsStream("images.jpeg"));

  • any valid URL, your avatar in example

    BufferedImage image = ImageIO.read(URI.create("http://www.gravatar.com/avatar/d5f91983a9d9cfb69981b6108a63b412?s=32&d=identicon&r=PG").toURL());

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top