0

我需要一些帮助来在 BufferedImage 上/内部/上绘制 Image 对象,然后在 JPanel 上绘制该 BufferedImage。

我准备了一个小程序来说明我的问题。只是一个带有 ImageLoader 的面板的框架。

图像与代码放置在同一文件夹中。刚绘制时,sten Image 已成功绘制,但当我尝试使用 BufferedImage 绘制时却没有,如果您尝试运行程序,您会注意到这一点。只需创建 Test 对象,其余的由构造函数完成。

提前致谢!

我的代码:

public class Test extends JFrame{

static class ImageLoader {
    public static Image loadImage(String name){
        Image img = null;
        img = Toolkit.getDefaultToolkit().getImage(ImageLoader.class.getResource(name));
        return img;
    }
}

class Panel extends JPanel{

    Image sten;
    BufferedImage bf = new BufferedImage(500,500,BufferedImage.TYPE_INT_RGB);

    public Panel(Image sten){
        super();
        this.sten = sten;
        initBF();
    } 

    private void initBF(){
        Graphics2D g = (Graphics2D) bf.createGraphics();
        g.drawImage(sten, 0,0,this);
    }

    public void paintComponent (Graphics g)
    {
        g.drawImage(bf, 100,100,null);
        g.drawImage(sten, 0,0,null);
        repaint();
    } 
}


public Test(){
    setSize(new Dimension(500, 500));
    setEnabled(true);
    this.setBounds(50, 150, 500, 500);
    setVisible(true);

    Image sten = ImageLoader.loadImage("sten.png");;

    Panel panel = new Panel(sten);
    panel.setBackground(Color.GREEN);
    panel.setSize(500, 500);
    this.add(panel);

    setDefaultCloseOperation(EXIT_ON_CLOSE);

    panel.paintComponent(this.getGraphics());
}

}

4

2 回答 2

1

问题是异步加载图像,因此在调用Toolkit.getDefaultToolkit().getImage时不会加载。paintComponent使用 aMediaTracker阻塞直到图像被加载:

public Image loadImage(String name) {
   Image img = null;
   MediaTracker tracker = new MediaTracker(myPanel); // pass the panel from ctor
   img = Toolkit.getDefaultToolkit().getImage(ImageLoader.class.getResource(name));
   tracker.addImage(img, 0);
   try {
      tracker.waitForID(0);
   } catch (InterruptedException e) {
      e.printStackTrace();
   }

   return img;
}

更简单

img = ImageIO.read(ImageLoader.class.getResource(name)));

这将消除使用MediaTracker.

一些注意事项:

  • 不要paintComponent直接调用,通过调用来请求重绘repaint
  • 不要getGraphics用于自定义绘画 - 这使用瞬态Graphics参考。
  • 使用自定义Graphics引用时,请确保Graphics#dispose在使用完引用后调用。
于 2013-05-24T14:01:15.667 回答
1

除了 Reimeus 的 aswer 之外,请注意它Toolkit.getDefaultToolkit().getImage()是非阻塞的,它异步加载图像,因此在您调用g.drawImage(sten, 0,0,this); sten时可能仍不会实际加载(参见方法的文档)。另请参阅此(错误)错误报告

于 2013-05-24T14:17:56.647 回答