【问题标题】:Getting a screenshot of a Java applet获取 Java 小程序的屏幕截图
【发布时间】:2011-11-04 01:42:39
【问题描述】:

我正在尝试使用 Java Robot 类对我从事的各种项目进行一些自动化测试,但在获取任何非全屏程序的屏幕截图时遇到了一些问题。

对于我只使用的全屏程序:

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); BufferedImage image = robot.createScreenCapture (dim);

我知道我通常无法获取特定窗口的屏幕截图,因为我很确定 Java 不知道每个窗口在屏幕上的位置(因为它特定于操作系统)。

但我希望我仍然可以在小程序查看器中获得小程序的屏幕截图,因为窗口以某种方式连接到 JVM。

那么,关于这是否可能的任何想法?如果是这样,我该怎么做?

【问题讨论】:

    标签: java applet screenshot automated-tests


    【解决方案1】:

    假设您有一个对您的小程序(或任何其他组件)的引用,您将创建一个屏幕外的 Graphics2D 实例并让组件自己绘制它。

      Component applet = ...;    // the applet
    
      Dimension size = applet.getSize();
      BufferedImage offScreenImage = (BufferedImage) applet.createImage(size.width, size.height);
      Graphics2D g2 = offScreenImg.createGraphics();
      g2.setBackground(applet.getBackground());
    
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    
      g2.clearRect(0, 0, size.width, size.height);
    
      applet.paint(g2);
    
      // now you can use BufferedImage as before
    

    关键是Component.createImage,它会为双缓冲创建一个离屏图像。

    【讨论】:

    • 对于如何表示“applet”变量是指我正在运行的小程序的特定实例,我有点困惑。在启动小程序查看器后,我尝试运行类似于您的代码的东西,但它一直告诉我'size' == java.awt.Dimension[width=0,height=0],我认为这意味着' applet' 不是指正在运行的 applet 的实例 :-(
    • 您确定在查看器初始化后获取引用吗?相反,如果您正在实例化一个新的小程序,那么它的大小将为零。如果您的applet 不依赖AppletContext,那么您可以简单地对其进行实例化,并将其放入Frame 中并调用init() 和start()。即创建您自己的查看器。
    • 不幸的是它依赖于 AppletContext,所以我想我被困在使用标准的 Appletviewer 上。我想我可能会错误地获取小程序引用,因为我在 appletviewer 中打开小程序后立即执行此操作(对于 Applet 类 Foo):applet = Foo()。这是不正确的吗?
    【解决方案2】:

    +1 在上面的答案中,无论如何您都应该使用双缓冲作为 java 小程序中的一般设计模式,以防止闪烁和其他更新视图的问题。

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 2010-10-19
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      相关资源
      最近更新 更多