我现在在jpanel里面画了一个图,超出屏幕范围,然后我用下面代码保存        Component c = jpanel;
        BufferedImage bi = (BufferedImage)c.createImage(c.getWidth(),c.getHeight());
        System.out.print(c.getHeight());
        c.paint(bi.getGraphics());
        try {
            javax.imageio.ImageIO.write(bi, "jpg", new File("c:/x1.jpg"));
        } catch (IOException ex) {
            Logger.getLogger(Form_Against_Graph.class.getName()).log(Level.SEVERE, null, ex);
        }
结果发现保存下来的图片画到一半的时候就从最初位置重画了。如图说明:在jpanel里面画的图没有问题,就是保存的时候变成这个样子,请问是有谁知道是怎么一回事,在哪里需要设置的么?

解决方案 »

  1.   

    楼主的JPanel是什么情况?超出屏幕范围,是指有滚动条么?还是说用绝对布局JPanel超出屏幕范围?我两种情况都试了,都挺好的啊。import javax.swing.*;
    import java.awt.*;
    import java.io.*;
    import java.awt.image.*;public class Test {
    public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setLayout(null);
    frame.setSize(400, 300);
    Component c = new MyPanel();
    c.setSize(new Dimension(500, 500));
    frame.add(c);
    frame.setVisible(true);
            BufferedImage bi = (BufferedImage)c.createImage(c.getWidth(),c.getHeight());
            c.paint(bi.getGraphics());
            try {
                javax.imageio.ImageIO.write(bi, "jpg", new File("c:/x1.jpg"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
    }
    }class MyPanel extends JPanel {
    @Override
    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    for (int i = 0; i < 10; i++) {
    g.drawRect(i * 50, i * 50, 50, 50);
    }
    }
    }
      

  2.   

    因为画得图较大,超出屏幕范围,是有出现滚动条了。差不多在c.getHeight() = 940那个地方就开始重画了,Tassdars你试着把用c.setsize(500,1500),看是否出现和我一样的情况。
      

  3.   

    问题已解决,貌似用paintComponent会画到一半重画了,具体原因未知。
    解决方法:在JPanel里面重写paint函数,而不是重写paintComponent函数。
    结贴。
      

  4.   

    我改成了滚动条版本的,原版和滚动条版本的都用1500的试过了,没有什么异常,楼主的情况真是奇怪代码:import javax.swing.*;
    import java.awt.*;
    import java.io.*;
    import java.awt.image.*;public class Test {
        public static void main(String[] args) {
            JFrame frame = new JFrame();
            frame.setSize(400, 300);
            Component c = new MyPanel();
            c.setPreferredSize(new Dimension(1500, 1500));
            frame.add(new JScrollPane(c));
            frame.setVisible(true);
            BufferedImage bi = (BufferedImage)c.createImage(c.getWidth(),c.getHeight());
            c.paint(bi.getGraphics());
            try {
                javax.imageio.ImageIO.write(bi, "jpg", new File("c:/x1.jpg"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }class MyPanel extends JPanel {
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            for (int i = 0; i < 35; i++) {
                g.drawRect(i * 50, i * 50, 50, 50);
            }
        }
    }楼主可能是哪里又改变了什么东西造成了重绘,总之应该不是paintComponent方法的问题