我无法获取我想要的JFrame的屏幕截图

时间:2014-03-31 15:02:31

标签: java swing

我有这段代码:`

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;


public class Provare extends JFrame {

    private JPanel contentPane;
    public static int x=100;
    public static int y=100;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    x=(int) (100+(x*(Math.random()*3)));
                    y=(int) (100+(y*(Math.random()*3)));
                    Provare frame = new Provare();
                    frame.setVisible(true);
                    BufferedImage image = new BufferedImage(frame.contentPane.getWidth(),frame.contentPane.getHeight(),BufferedImage.TYPE_INT_RGB );
                    frame.contentPane.printAll(image.getGraphics());
                    ImageIO.write(image, "bmp", new File("C:/Users/Resco/Desktop/scarpe/screen.bmp") );
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Provare() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, x, y);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
    }

    public void paint(Graphics g){
        super.paint(g);
        g.drawString("CIAO",(x/2),(x/2));
        g.drawLine(50, 50, 100, 100);
    }

}

`

我想要的是带有文本CIAO和一行的屏幕截图。 我实际得到的是一个空元素的截图。

有什么建议吗?随意发布我的代码的修改版本。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您正在图片上打印contentPane内容:contentPane没有任何内容需要打印,它是空的。

你必须使用

frame.printAll(image.getGraphics());

旁注:您不应该从paint覆盖JFrame方法来执行自定义绘制。改为从paintComponent覆盖JPanel方法。

答案 1 :(得分:0)

我的提示是,你的框架还没准备好。我会尝试在frame.setVisible(true)中调用EventQueue.invokeAndWait并从主线程中获取屏幕截图。