drawImage () с использованием BufferedImage не рисует - PullRequest
0 голосов
/ 25 февраля 2012
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);
    }
}

Если я раскомментирую строку g.drawImage(img,0,0,this);, я получаю свое изображение в окне. Но с этим кодом я вижу пустое окно. Легко понять, что g.drawImage(img,i*20,j*20,20,20,this); в цикле не рисует, но в чем проблема?

Ответы [ 2 ]

3 голосов
/ 25 февраля 2012

отредактировал несвязанный материал, который я сделал для будущих читателей, чтобы найти ответ легче. В Java мне всегда приходилось использовать getResource или getResourceAsStream, чтобы обеспечить корректную загрузку файла из нужного каталога.

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;
        }
    }
}
1 голос
/ 25 февраля 2012

1) положить BufferedImage как значок в JLabel пример здесь

2) ваш paintComponent в CustomCanvas может быть

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);
    }
}
...