【发布时间】:2015-04-20 00:42:34
【问题描述】:
此实用程序应用程序通过按下 JFrame 上的按钮来截取多个监视器的屏幕截图。该方法的预期逻辑如下:
- 创建新的 Rectangle 来表示所有监视器边界的联合
- 使用 InvokeAndWait 隐藏到 JFrame,并确保在进一步处理之前将其隐藏
- 使用机器人类截取屏幕截图
- 再次将框架设置为可见并返回图像
即使最后的“将框架返回可见”步骤从代码中注释掉,执行后我在屏幕上看不到任何框架,但该框架在屏幕截图中是可见的。我不知道为什么。
使用 print 语句,我已经确定在截取屏幕截图之前触发使 JFrame 不可见的方法确实会运行。我还尝试使用 if 语句在截屏之前检查 JFrame 是否可见,并且从未触发过 if 语句。
解决办法是什么?
public Image capture(ArrayList<Monitor> monitors) {
Rectangle bounds = new Rectangle();
monitors.stream().forEach(a -> Rectangle.union(bounds, a.getBounds(), bounds) );
Image image = null;
try {
EventQueue.invokeAndWait(() -> {
frame.setVisible(false);
System.out.println("Set frame invisible");
});
} catch (Exception ex) {
ex.printStackTrace();
}
try {
image = new Image(new Robot().createScreenCapture(bounds));
} catch (Exception ex) {
ex.printStackTrace();
}
//frame.setVisible(true);
return image;
}
【问题讨论】: