首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Java中仅当我的框架在屏幕上消失时进行操作?

如何在Java中仅当我的框架在屏幕上消失时进行操作?
EN

Stack Overflow用户
提问于 2016-08-09 19:05:22
回答 2查看 173关注 0票数 2

我需要在我的屏幕上截取一个区域的屏幕截图,以便在Java中使用"Robot“。但是,如果用户将窗口放置在该区域,则窗口将显示在屏幕截图上,而不是背景上。

为了解决这个问题,我放了一个:

代码语言:javascript
运行
复制
myframe.setVisible(false);

但当我看屏幕截图时,窗口就会出现在上面。我认为这是因为窗口没有足够的时间消失,或者因为屏幕的渲染还没有更新,所以我尝试了不同的方法,比如使用:

代码语言:javascript
运行
复制
repaint();

或者通过将一个

代码语言:javascript
运行
复制
try{}finally{}

块中的操作以确保try块中的操作已完成。但这些解决方案都不起作用。在我看来,这些都是其他的方式,但它们在全局上看起来很糟糕,因为它们使用函数来等待。

那么我的问题有没有好的解决方案呢?

EN

回答 2

Stack Overflow用户

发布于 2016-08-09 20:21:11

您可以使用窗口侦听器在窗口关闭时触发屏幕截图:

代码语言:javascript
运行
复制
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class MainFrame extends JFrame implements WindowListener {

    public MainFrame() {

        super("Test Frame");
        JLabel displayMsg = new JLabel("    Close window");
        getContentPane().add(displayMsg);

        addWindowListener(this);
        setSize(400, 300);
        setVisible(true);

    }

    @Override
    public void windowClosing(WindowEvent e) {

        System.out.println("WindowListener method called: windowClosing.");
        //add you screen capture code here
    }

  //--Not used

    @Override
    public void windowClosed(WindowEvent e) {
        //do nothing
    }

    @Override
    public void windowOpened(WindowEvent e) {
       //do nothing
    }

    @Override
    public void windowIconified(WindowEvent e) {
         //do nothing
    }

    @Override
    public void windowDeiconified(WindowEvent e) {
         //do nothing
    }

    @Override
    public void windowActivated(WindowEvent e) {
         //do nothing
    }

    @Override
    public void windowDeactivated(WindowEvent e) {
         //do nothing
    }

    public void windowGainedFocus(WindowEvent e) {
         //do nothing
    }

    public void windowLostFocus(WindowEvent e) {
         //do nothing
    }

    public static void main(String[] args) {
         new MainFrame();
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-08-09 19:10:24

使用SwingUtilities.invokeLater()截取实际的屏幕截图。不是100%确定,但我认为在程序流回到事件调度循环之前,myframe.setVisible(false);不会变得有效。

编辑:代替

代码语言:javascript
运行
复制
  useRobotToMakeScreenshot();

代码语言:javascript
运行
复制
  javax.swing.SwingUtilities.invokeLater(new Runnable() {
      public void run() {
          useRobotToMakeScreenshot();
      }
  }

(当然,您必须将useRobotToMakeScreenshot()替换为执行截图操作的方法的实际调用)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38849026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档