我有一个名为drawPanel
的JPanel对象。我在它上面画了各种各样的东西,比如矩形,当我尝试创建一个bufferedimage并将其保存为下面时,它只保存一个只有背景颜色的空白图像而不是绘制在框架上的矩形。
BufferedImage image = createImage(drawPanel);
File outputfile = new File("MyImage.jpg");
try {
ImageIO.write(image, "jpg", outputfile);
} catch (IOException e) {
e.printStackTrace();
}
public BufferedImage createImage(JPanel panel) {
int w = panel.getWidth();
int h = panel.getHeight();
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
panel.print(g);
return bi;
}
请帮助我解决这个问题。
答案 0 :(得分:3)
这个Graphics2D g2 = (Graphics2D) drawPanel.getGraphics();
是你的问题。致电print
,printAll
或paint
将使用getGraphics
清除对组件绘制的任何内容。
简短的回答是,永远不要使用它。答案很长,创建一个自定义组件,从JPanel
这样的方法扩展并覆盖它的paintComponent
方法,并在其中调用所有自定义绘画,当它被调用时
有关详细信息,请参阅Painting in AWT and Swing和Performing Custom Painting
答案 1 :(得分:2)
Robot
只需将您的方法createImage
替换为我的方法。 : - )
public BufferedImage createImage(JPanel panel) {
//Get top-left coordinate of drawPanel w.r.t screen
Point p = new Point(0, 0);
SwingUtilities.convertPointToScreen(p, panel);
//Get the region with wiht and heighht of panel and
// starting coordinates of p.x and p.y
Rectangle region = panel.getBounds();
region.x = p.x;
region.y = p.y;
//Get screen capture over the area of region
BufferedImage bi = null;
try {
bi = new Robot().createScreenCapture( region );
} catch (AWTException ex) {
Logger.getLogger(MyPaintBrush.class.getName()).log(Level.SEVERE, null, ex);
}
return bi;
}