eXXXXXXXXXXX2
eXXXXXXXXXXX2

Reputation: 1580

drawImage() with using BufferedImage doesn't draw

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class Main
{
    JFrame jf;
    Main()
    {
        jf=new JFrame();
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.add(new MyCanvas());
        jf.pack();
        jf.setVisible(true);
    }
    public static void main(String[] args)
    {
        MyCanvas.img=Toolkit.getDefaultToolkit().createImage("1.jpg");
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new Main();
            }
        });
    }
}
class MyCanvas extends JComponent
{
    static Image img;
    BufferedImage bi;
    MyCanvas()
    {
        setPreferredSize(new Dimension(200,200));
        bi=new BufferedImage(200,200,BufferedImage.TYPE_INT_ARGB);
        Graphics g=bi.getGraphics();
        for (int i=0;i<10;i++)
            for (int j=0;j<10;j++)
                g.drawImage(img,i*20,j*20,20,20,this);
    }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(bi,0,0,this);
        //g.drawImage(img,0,0,this);
    }
}

If I uncomment line g.drawImage(img,0,0,this); I get my image on window. But with this code I see empty window. It is easy to understand that g.drawImage(img,i*20,j*20,20,20,this); in loop doesn't draw but what is problem?

Upvotes: 0

Views: 5392

Answers (2)

annirun
annirun

Reputation: 123

edited out the unrelated stuff I did for future readers to find the answer easier. In java i've always had to use getResource or getResourceAsStream to ensure the file loaded from the right directory correctly.

class MyCanvas extends JComponent
{
    public static Image loadImage(String s)
    {
        try 
        {
            return ImageIO.read(Main.class.getResource(s));
        } 
        catch (Exception ex) 
        {
            ex.printStackTrace();
            return null;
        }
    }
}

Upvotes: 3

mKorbel
mKorbel

Reputation: 109813

1) put BufferedImage as Icon to the JLabel example here

2) your paintComponent in CustomCanvas could be

class MyCanvas extends JComponent {

    private static final long serialVersionUID = 1L;

    @Override
    public Dimension getMinimumSize() {
        return new Dimension(150, 150);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(300, 300);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(bi,0,0,this);
    }
}

Upvotes: 1

Related Questions