Robot类 - 在Java App最小化/在后台

时间:2016-07-04 18:02:10

标签: 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().createScreenCapture(screenRect);
    } catch (AWTException e2) {
        e2.printStackTrace();
    }

我想要屏幕截图的组件示例是JFrame,Applet和JPanels。在回答这个问题时,任何一个例子都是令人满意的。

修改 此代码解决了允许您在最小化或在后台运行和截屏时的问题。感谢Dando18。

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函数 控件/组件及其内容显示在主JFrame上,但是 小程序不会出现,即使它向我显示我的游戏它正在发回该部分的黑屏截图。

如何在我的应用程序中加载

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

  • Applet位于Main JFrame上
  • Applet的存根实现了AppletContext,AppletStub

主JFrame - >调用名为 Loader 的类并将参数传递给它 - >参数从Loader传递给名为 Stub 的类 - > Applet设置为Stub - > Applet被添加到Main JFrame居中。

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

1 个答案:

答案 0 :(得分:2)

如果您不必使用Robot,则应返回组件的BufferedImage。

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);

或使用Robot

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