Java 在BuffereImage上绘制图像对象以供以后使用
我需要一些帮助,在BuffereImage上/内部/绘制图像对象,然后在JPanel上绘制该BuffereImage 我准备了一个小程序来说明我的问题。只有一个带有面板的框架和一个ImageLoader 图像与代码放在同一文件夹中。sten图像在刚绘制时绘制成功,但在我尝试使用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
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
Toolkit.getDefaultToolkit().getImage()
是非阻塞的,它异步加载图像,因此在调用g.drawImage(sten,0,0,this)时
sten
可能仍然无法实际加载(请参阅该方法的文档)。另请参见此项(错误)。谢谢您的回答和其他提示!当我在其他应用程序中使用相同的方法时,我会将synchronized添加到方法声明中。这能解决问题吗?不,synchronized
与此无关。
img = ImageIO.read(ImageLoader.class.getResource(name)));