Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在BuffereImage上绘制图像对象以供以后使用_Java_Image_Panel_Bufferedimage_Drawimage - Fatal编程技术网

Java 在BuffereImage上绘制图像对象以供以后使用

Java 在BuffereImage上绘制图像对象以供以后使用,java,image,panel,bufferedimage,drawimage,Java,Image,Panel,Bufferedimage,Drawimage,我需要一些帮助,在BuffereImage上/内部/绘制图像对象,然后在JPanel上绘制该BuffereImage 我准备了一个小程序来说明我的问题。只有一个带有面板的框架和一个ImageLoader 图像与代码放在同一文件夹中。sten图像在刚绘制时绘制成功,但在我尝试使用BuffereImage绘制它时绘制不成功,如果您尝试运行该程序,您会注意到这一点。只需创建测试对象,其余部分由构造函数完成 提前谢谢 我的代码: public class Test extends JFrame{ st

我需要一些帮助,在BuffereImage上/内部/绘制图像对象,然后在JPanel上绘制该BuffereImage

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

图像与代码放在同一文件夹中。sten图像在刚绘制时绘制成功,但在我尝试使用BuffereImage绘制它时绘制不成功,如果您尝试运行该程序,您会注意到这一点。只需创建测试对象,其余部分由构造函数完成

提前谢谢

我的代码:

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

}问题在于
Toolkit.getDefaultToolkit().getImage
异步加载图像,因此调用
paintComponent
时不会加载图像。使用
MediaTracker
进行阻止,直到图像已加载:

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;
}
或者简单得多:

这样就无需使用
MediaTracker

一些注意事项:

  • 不要直接调用
    paintComponent
    ,通过调用
    repaint
    请求重新绘制
  • 不要将
    getGraphics
    用于自定义绘制-这将使用瞬态
    Graphics
    参考
  • 使用自定义
    图形
    参考时,请确保在使用完参考后调用
    图形#dispose

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

谢谢您的回答和其他提示!当我在其他应用程序中使用相同的方法时,我会将synchronized添加到方法声明中。这能解决问题吗?不,
synchronized
与此无关。
img = ImageIO.read(ImageLoader.class.getResource(name)));