我想拍一張JavaJFrame
的截圖。
有時幀渲染未完成,但屏幕截圖操作已完成。但有時他并沒有出現這種情況,好像根計算機的性能有一定的關系!
情景截圖<---情景截圖
我想我可以用Thread.sleep()
延遲截圖,但不能確定sleep()
的時間長度。
Java code:
package com.richardtang.apktesttool;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class Test2 {
public static Robot robot;
static {
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
JPanel jPanel = new JPanel();
for (int i = 1; i < 1000; i++) {
jPanel.add(new JLabel(String.valueOf(i)));
}
JFrame jFrame = new JFrame();
jFrame.setSize(500, 500);
jFrame.setContentPane(jPanel);
jFrame.setVisible(true);
BufferedImage img = captureFrame(jFrame);
try {
ImageIO.write(img, "png", new File("/tmp/1.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static BufferedImage captureFrame(JFrame window) {
window.setAlwaysOnTop(true);
Point windowPoint = window.getLocation();
Dimension windowSize = window.getSize();
Rectangle rectangle = new Rectangle(
(int) windowPoint.getX(),
(int) windowPoint.getY(),
windowSize.width,
windowSize.height
);
return robot.createScreenCapture(rectangle);
}
}
您可以使用SwingUtilities調用器。根據文檔,
invokeLater
導致在AWT事件調度thread上異步執行doRun.run(。這將在處理完所有掛起的AWT事件后發生。因此,將在框架/面板繪圖完成后捕獲屏幕截圖。Update
正如@camickr正確指出的,確保您的GUI也是以類似的方式創建的,即在AWT事件調度Thread(EDT)上。下面的例子。