作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在通过按下部署到 JFrame 中的按钮执行的操作(即方法)中,我想隐藏 java 应用程序,然后获取屏幕截图。最后,截取屏幕截图后,我需要使 JFrame
可见。
方法如下:
public void myButtonPressedAction(){
//Hiding the JFrame
this.setVisible(false);
//Now I use Robot to get a screenshot using another method
//not reported for simplicity
myMethodToGetScreenshot();
//Making the JFrame visible
this.setVisible(true);
}
发生的情况是,一旦可见性设置为 false,应用程序开始变得不可见,并且我立即获得屏幕截图:不幸的是,屏幕截图在淡出时也捕获了 JFrame
(即,它将变得不可见,isVisible
方法返回 true
,但 JFrame
并不是完全不可见)。
一种可能的解决方案是插入一个计时器,在对 setVisible(false)
的调用和对 myMethodToGetScreenshot()
的调用之间设置延迟。然而,假设系统繁忙,延迟可能会被低估;相反,较大的延迟会使我的应用程序变慢!
我怎样才能获得JFrame
完全淡出的确切时间瞬间,即它真的不可见?
编辑
这在构造函数中初始化:
String myPath= ...;//here I have a String that represent a path to a folder.
JPEGImageWriteParam JPEG_PARAMS_BEST_QUALITY = new JPEGImageWriteParam(null);
JPEG_PARAMS_BEST_QUALITY.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
JPEG_PARAMS_BEST_QUALITY.setCompressionQuality(1f);
这是myMethodToGetScreenshot()
的代码:
public void myMethodToGetScreenshot(){
BufferedImage capture = new Robot().createScreenCapture(screenArea);
ImageWriter writer = writerService.getWriter();
writer.setOutput(new FileImageOutputStream(new File(myPath+"screenshot.jpg")));
writer.write(null, new IIOImage(capture, null, null), JPEG_PARAMS_BEST_QUALITY);
}
这是我得到的屏幕截图。您可以看到 JFrame 淡出...
最佳答案
然后设置一些延迟时间。您可以使用Swing timer .
这是一个小演示:
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class ScreenshotDemo {
JFrame frame = new JFrame();
JButton button = new JButton("Catch the screenshot");
Timer timer;
Robot robot;
JLabel label = new JLabel();
public ScreenshotDemo() {
try {
robot = new Robot();
} catch (AWTException e1) {
e1.printStackTrace();
}
// Keeps frame disposed for 3 seconds
timer = new Timer(3000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Rectangle size = new Rectangle(Toolkit.getDefaultToolkit()
.getScreenSize());
Image image = robot.createScreenCapture(size);
label.setIcon(new ImageIcon(image));
frame.setVisible(true);
}
});
timer.setRepeats(false);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
frame.setVisible(false);
timer.start();
}
});
frame.add(button, BorderLayout.NORTH);
frame.add(label, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// frame.pack();
frame.setSize(1024, 768);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ScreenshotDemo();
}
});
}
}
基本上,您将隐藏框架一段时间(在本演示中为 3 秒)。当框架隐藏时,您将拍摄快照。
关于java - JFrame 和可见性 : issue with fading out and getting a screenshot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17188012/
我是一名优秀的程序员,十分优秀!