我想截取 Java 的螢屏截圖JFrame。
有時幀渲染沒有完成,但是截圖操作完成了。但有時他不會出現這種情況,好像root電腦的性能有一定的關系!
情況截圖<--- 情況截圖
我想我可以用 延遲截圖Thread.sleep(),但不能確定sleep()時間長度。
Java代碼:
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);
}
}
uj5u.com熱心網友回復:
您可以使用SwingUtilities invokeLater。根據檔案,invokeLater 導致 doRun.run() 在 AWT 事件調度執行緒上異步執行。這將在處理完所有未決 AWT 事件后發生。因此,螢屏截圖將在框架/面板繪制完成后被捕獲。
更新
正如@camickr 正確指出的那樣,確保您的GUI 也是以類似的方式創建的,即在AWT 事件調度執行緒(EDT)上。下面的例子。
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 ScreenCapture {
JFrame jFrame = null;
public void createGUI() {
JPanel jPanel = new JPanel();
for (int i = 1; i < 1000; i ) {
jPanel.add(new JLabel(String.valueOf(i)));
}
jFrame = new JFrame();
jFrame.setSize(500, 500);
jFrame.setContentPane(jPanel);
jFrame.setVisible(true);
}
public void capture() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
BufferedImage img = captureFrame(jFrame);
ImageIO.write(img, "png", new File("tmp/1.png"));
} catch (AWTException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
public static void main(String[] args) {
ScreenCapture sc = new ScreenCapture();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
sc.createGUI();
sc.capture();
}
});
}
public static BufferedImage captureFrame(JFrame window) throws AWTException {
Robot robot = new Robot();
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);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/415682.html
標籤:
上一篇:兩個組件,一個具有固定寬度
