我需要在我的屏幕上截取一个区域的屏幕截图,以便在Java中使用"Robot“。但是,如果用户将窗口放置在该区域,则窗口将显示在屏幕截图上,而不是背景上。
为了解决这个问题,我放了一个:
myframe.setVisible(false);但当我看屏幕截图时,窗口就会出现在上面。我认为这是因为窗口没有足够的时间消失,或者因为屏幕的渲染还没有更新,所以我尝试了不同的方法,比如使用:
repaint();或者通过将一个
try{}finally{}块中的操作以确保try块中的操作已完成。但这些解决方案都不起作用。在我看来,这些都是其他的方式,但它们在全局上看起来很糟糕,因为它们使用函数来等待。
那么我的问题有没有好的解决方案呢?
发布于 2016-08-09 20:21:11
您可以使用窗口侦听器在窗口关闭时触发屏幕截图:
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();
}
}发布于 2016-08-09 19:10:24
使用SwingUtilities.invokeLater()截取实际的屏幕截图。不是100%确定,但我认为在程序流回到事件调度循环之前,myframe.setVisible(false);不会变得有效。
编辑:代替
useRobotToMakeScreenshot();写
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
useRobotToMakeScreenshot();
}
}(当然,您必须将useRobotToMakeScreenshot()替换为执行截图操作的方法的实际调用)
https://stackoverflow.com/questions/38849026
复制相似问题