Robot类-Java应用程序最小化/在后台时特定帧/组件的屏幕截图

Robot类-Java应用程序最小化/在后台时特定帧/组件的屏幕截图,java,swing,awt,Java,Swing,Awt,如何在Java应用程序中捕获特定组件而不是完整的主监视器 我如何收集图像的当前代码示例: Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); BufferedImage image = null; try {//take the screenshot and store in buf img image = new Robot().create

如何在Java应用程序中捕获特定组件而不是完整的主监视器

我如何收集图像的当前代码示例:

    Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
    BufferedImage image = null;
    try {//take the screenshot and store in buf img
        image = new Robot().createScreenCapture(screenRect);
    } catch (AWTException e2) {
        e2.printStackTrace();
    }
我想要截屏的组件示例是JFrame、Applet和JPanels。回答这个问题时,任何一个例子都是令人满意的

编辑: 这段代码解决了允许您在最小化或在后台运行和拍摄屏幕截图的问题。多亏了丹多

public static BufferedImage createImage(JComponent comp) {
    int w = comp.getWidth();
    int h = comp.getHeight();
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = bi.createGraphics();
    comp.paint(g);
    return bi;
}
剩余问题:

  • 当我在屏幕上使用getComponent或getContentPane截图时 我的JFrame并将其传递给createImage函数,它显示每个 控件/组件及其内容显示在主框架上,但 小程序将不会出现,即使它正在向我显示我的游戏,它正在发回该部分的黑屏快照
它在我的应用程序中的加载方式:

以下条件适用于我的小程序

  • 小程序位于主框架上
  • Applet的存根实现AppletContext,AppletStub
Main JFrame->调用名为Loader的类并将参数传递给它->参数被传递给我的名为Stub的类,从Loader->Applet被设置为Stub->Applet被添加到Main JFrame


我不明白为什么这个组件不能与主JFrame上的其他组件一起捕获。我知道Applet是awt的一个组件,而不是swing的JComponent,我尝试了Applet的一个屏幕截图,通过从Loader类返回它,并将just Component传递给createImage覆盖签名,它似乎只捕获了一个小窗口,与捕获我的应用程序的主JFrame不同,但它仍然是一个黑色图像。

如果您不必使用
Robot
这应该会返回一个组件的BuffereImage

public static BufferedImage createImage(JComponent comp) {
    int w = comp.getWidth();
    int h = comp.getHeight();
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = bi.createGraphics();
    comp.paint(g);
    return bi;
}
简单地说:

BufferedImage component_screenshot = createImage(myComponent);
或使用
机器人

try {
    BufferedImage img = new Robot().createScreenCapture(new Rectangle(
                                      frame.getLocationOnScreen().x,
                                      frame.getLocationOnScreen().y,
                                      frame.getWidth(),
                                      frame.getHeight()));
} catch (AWTException ex) {
}

你必须使用机器人吗?IIRC JFrame有一个getRectangle()方法,在这种情况下,我可以想象使用它来代替screenRect,因为机器人根本不需要。建议是开放的,欢迎使用。1)请参阅中的
ComponentImageCapture
。2) 提示:添加@Dando18(或任何人,
@
很重要)以通知此人新的评论。谢谢@andrewhompson,我现在将进行测试。如果组件区域的渲染依赖于不是其子组件的其他组件,则此方法不起作用,例如,组件是透明的。@HeseinBurg如果窗口关闭,第二种方法将不起作用。您可以尝试第一种方法来理解Coderino所说的话。第一部分我现在只得到我的主应用程序,但不幸的是没有按照Coderino的建议在屏幕截图中呈现我的Java小程序。我将我的小程序添加到我的主框架(我正在截屏的小程序)中,是否有任何方法可以解决此问题?“…是否有任何方法可以解决此问题?”为了更快地获得更好的帮助,请发布一个或您的尝试。