繁体   English   中英

无法创建JFrame的屏幕截图

[英]Can't create a screenshot of a JFrame

我正在尝试使用Java截屏,我有以下代码:

import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class Visualizer {
    public static final void makeScreenshot(JFrame argFrame) {
        Rectangle rec = argFrame.getBounds();
        BufferedImage bufferedImage = new BufferedImage(rec.width, rec.height,
                BufferedImage.TYPE_INT_ARGB);
        argFrame.paint(bufferedImage.getGraphics());

        try {
            // Create temp file.
            File temp = File.createTempFile("screenshot", ".png");

            // Use the ImageIO API to write the bufferedImage to a temporary file
            ImageIO.write(bufferedImage, "png", temp);

            // Delete temp file when program exits.
            temp.deleteOnExit();
        } catch (IOException ioe) {
        } // catch
    }

    public static void main(String[] args) {
        JFrame window = new JFrame();
        makeScreenshot(window);
    }
}

但这会引发异常:

线程“主”中的异常java.lang.IllegalArgumentException:宽度(0)和高度(0)不能为<= 0

问题是您的框架尺寸返回0.当您调用rec.width()它对于高度返回0.same。但是如果您调用setVisible(true)则矩形具有正确的值。实际上您的矩形是空矩形。 java.awt.Rectangle[x=0,y=0,width=0,height=0]

解决这个问题;

调用setVisible(true)

JFrame window = new JFrame();
window.setVisible(true);
makeScreenshot(window);

如果你打电话

JFrame window = new JFrame();
window.pack();
makeScreenshot(window);

它也可以

JFrame#getBounds() (或更确切地说是Component#getBounds() )' API

边界指定了此组件相对于其父组件的宽度,高度和位置。

专注于相对于其父对象 :这可能意味着负值或0

反过来,使用width / height的负值初始化BufferedImage会抛出IllegalArgumentException

我试过了,它有效:

1)从框架中获取图像

public static BufferedImage getFrameImage(JFrame argFrame){
    int w = argFrame.getWidth();
    int h = argFrame.getHeight();
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = bi.createGraphics();
    g.setColor(Color.white);
    g.fillRect(0, 0, w, h);
    argFrame.paint(g);
    paint(g);
    return bi;
}

2)保存该图像:

public static final void makeScreenshot(JFrame argFrame) {
    try {
        // Create temp file.
        File temp = File.createTempFile("screenshot", ".png");

        // Use the ImageIO API to write the bufferedImage to a temporary file
        ImageIO.write(getFrameImage(argFrame), "png", temp);

        // Delete temp file when program exits.
        temp.deleteOnExit();
    } catch (IOException ioe) {
    } // catch
}

但是看到您的代码,我没有发现任何错误。 这可能是与JFrame相关的问题,它可能从未设置为visible或pack(),并且可能尚未定义高度和宽度。

更好的做法是在JFrame窗口上放置一些JLabel或面板,以确保其大小不会为0。类似:

public static void main(String[] args) {

    JFrame window = new JFrame();
    JPanel panel = new JPanel();
    JLabel label = new JLabel("Hello Everyone!!");

    panel.add(label);
    window.add(panel);

    window.setVisible(true);
    window.pack();
    makeScreenshot(window);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM