如何確定JFrame的繪圖狀態?

我想拍一張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)上。下面的例子。

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);
    }
}
主站蜘蛛池模板: 91在线精品亚洲一区二区| 国产精品一区二区久久乐下载| 亚洲av无码一区二区三区在线播放 | 国产主播福利精品一区二区| 久久免费区一区二区三波多野| 加勒比精品久久一区二区三区| 日本午夜精品一区二区三区电影| 亚洲综合色一区二区三区小说| 一区二区三区在线|日本| 精品成人一区二区三区免费视频| 国产精品成人免费一区二区| 国产成人精品亚洲一区| 亚洲一区无码中文字幕乱码| 亚州日本乱码一区二区三区| 奇米精品一区二区三区在| 91国在线啪精品一区| 国产一区二区电影在线观看| 亚洲国产精品自在线一区二区| 日韩毛片基地一区二区三区| 麻豆AV天堂一区二区香蕉| 国产吧一区在线视频| 91精品福利一区二区| 精品国产一区二区三区香蕉事| 精品久久久中文字幕一区| 免费一本色道久久一区| 无码少妇A片一区二区三区| 国产精品视频一区国模私拍| 色屁屁一区二区三区视频国产| 亚洲a∨无码一区二区| 日本免费一区尤物| 视频一区二区在线观看| 精品无码国产一区二区三区AV| 久久精品动漫一区二区三区| 末成年女A∨片一区二区| 精品一区精品二区制服| 成人精品视频一区二区| 无码精品久久一区二区三区| 奇米精品一区二区三区在| 久久久无码一区二区三区| 国产麻豆精品一区二区三区| 美女视频免费看一区二区 |