【问题标题】:Trying to bring swing frame to front before taking a screenshot but getting artifacts尝试在截屏之前将摆动框架置于前面但得到伪影
【发布时间】:2009-08-14 21:33:01
【问题描述】:

我的应用程序中有一部分会截取某个窗口的屏幕截图,但在我这样做之前,我想将窗口放在前面。这在我的 Mac 机器上运行良好,但是当我在 Windows XP 上并行测试它时,屏幕截图总是在重叠窗口所在的位置出现灰色区域。似乎总是在我想要在顶部的窗口被转移到顶部时截取屏幕截图。我都试过了:

     frame.setVisible(true);
            and
     frame.setAlwaysOnTop(true);

有人对此问题有合理的解决方案吗?

【问题讨论】:

  • 你能贴出截图并调用frame.setVisible(true)的代码片段吗?

标签: java swing jframe always-on-top


【解决方案1】:

如果你想截取由 Java 绘制的窗口w,你可以要求它在一个窗口上绘制自己

BufferedImage bi = new BufferedImage(
    w.width, w.height, BufferedImage.TYPE_INT_RGB); 
Graphics g = bi.getGraphics();

通过调用 Windows 的 paint(g) 方法。然后,您可以将 BufferedImage 保存到文件中。如果你正在抓住一个外部窗口,那么我相信 Oscar Reyes 已经给了你所有的答案。

【讨论】:

  • 太棒了,这工作完美,看起来很干净。非常感谢!
【解决方案2】:
  • 您可以为截取屏幕截图的线程添加延迟。

  • 当它获得焦点时,您可以从框架中触发屏幕截图:

    class ScreenshotShooter implements FocusListener  {
        public void focusGained( FocusEvent e ) {
            // smile..... 
            // you may add a sec of delay here just be be sure.
        }
        public void focusLost( FocusEvent e ) {}
     }
    
    
     FocusListener focusListener = new ScreenshotShooter();
     frame.addFocusListener( focusListener );
     frame.setVisible( true ); // should autofire
     frame.remoe( focusListener);
    
  • 两者都可以。

【讨论】:

  • 我对此感到厌烦,但延迟似乎延长了刷新所需的时间。我在想我也许可以启动一个新线程来休眠一段时间,并将其锁定在屏幕截图线程上,但这一切似乎都很草率,并不能保证在不同速度的机器上都能成功。
  • 哦,肯定应该在另一个线程中,或者至少使用 SwingUtilities.invokeLater() .... 否则你会停下来,截取屏幕截图,然后让它可见。
  • 这听起来像是一个合理的解决方案,我会尝试的。谢谢。
猜你喜欢
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
相关资源
最近更新 更多