我试了一下,如果jcomponent是可见的就能保存上,如果不可见保存的图片就是黑的。
这应该是因为paintAll()方法中判断了组件是否显示了出来    public void paintAll(Graphics g) {
        if (isShowing()) {
    GraphicsCallback.PeerPaintCallback.getInstance().
        runOneComponent(this, new Rectangle(0, 0, width, height),
g, g.getClip(),
GraphicsCallback.LIGHTWEIGHTS |
GraphicsCallback.HEAVYWEIGHTS);
}
    }
我试了把paintAll(g); 改成  paint(g); 就可以在jcomponent不可见的情况下也保存成功。
不知道你遇到的情况是怎样的。

解决方案 »

  1.   

    我在使用的时候传入的是JPanel,按照你改了之后效果还是一样。另外我还有一段代码,读入图形显示到JPanel上,出现了中间固定位置有个空白矩形的问题。
    代码在下一贴,希望指导一下,谢谢
      

  2.   

    try{ BufferedImage image = ImageIO.read(file);     //File  file 为读入的图形文件
         drawPanel.getGraphics().drawImage((Image)image,0,0,drawPanel); 
                                            //drawPanel类型为JPanel 
        }catch(Exception e){
       }问题:JPanel中显示的图形,中间始终有个空白矩形区域 -_-
      

  3.   

    组件不负责保存你用图形操作方法画出的图象,当这个组件被别的窗口覆盖或者重新绘制的时候,原来画上去的图形就丢失了,所以你需要覆盖组件缺省的绘制方法,加入绘制你需要的图形的代码。这样当组件当组件从被别的窗口的覆盖的状态下恢复或者程序中调用repaint()是,你所要的图形才能过被画出来。class DrawPanel extends JPanel
    {
    Image image = null;
    public DrawPanel(Image image)
    {
    this.image = image;
    } protected void paintComponent(Graphics g) 
    {
    super.paintComponent(g);
    g.drawImage(image, 0, 0, this);
    } public Dimension getPreferredSize() {
    return image == null ? new Dimension(0,0) :
    new Dimension(image.getWidth(this), image.getHeight(this));
    }
    }BufferedImage image = ImageIO.read(file);
    DrawPanel drawPanel = new DrawPanel(image);
    然后把这个drawPanel 传给saveFile()方法。