Java:截图后获取照片点击效果

时间:2012-12-24 10:48:23

标签: java swing screenshot

我写了两个类FullScreen,其中包含截图的逻辑,FullScreenGUI,其中包含模拟照片点击效果的逻辑。

照片点击效果基本上会在短时间内以白色闪烁屏幕,比如截屏后50ms。它是通过覆盖整个屏幕来生成JFrame,不透明度为1%。背景为白色,然后不透明度从1%变为100%,保持50ms,然后回到1%。

FullScreen构造函数有两个参数,一个用于截取屏幕截图,另一个用于持续时间。

FullScreenGUI构建JFrame,将其最大化,将背景设置为白色。调用fire()方法时,会根据需要更改不透明度以产生效果。

问题:

使用下面的代码我可以在第一次拍摄截图时产生效果,但不能用于后续点击。假设,使用参数FullScreen调用(4,2)构造函数(即每次持续2秒,每次点击4次),然后第一次点击效果很好,但剩余的3次点击则不然。 JFrame的{​​{1}}似乎没有出现在前面,因此效果不明显。我尝试了FullScreenGUIJFrame.setAlwaysOnTop(true),但似乎没有将JFrame.toFront()置于顶部。

截屏时没有问题,而是效果。你还有其他的想法吗?

以下是代码JFrame

FullScreen.java

import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.ImageIO; import javax.swing.Timer; import javax.swing.filechooser.FileSystemView; class FullScreen { int times, duration; Timer t; Robot r; BufferedImage bi; FullScreenGUI fg; FullScreen(int tim, int duration) { fg = new FullScreenGUI(); fg.setVisible(true); this.times = tim; this.duration = duration; try { r = new Robot(); } catch (AWTException e) { e.printStackTrace(); } System.out.println("Inside constructor"); t = new Timer(duration*1000, new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { System.out.println("Inside action"); if(times>0) { System.out.println("times: "+times); //Get the screenshot bi = capture(); //Gives the path of the home directory. For windows, it'll go to your desktop FileSystemView filesys = FileSystemView.getFileSystemView(); File fl = filesys.getHomeDirectory(); saveImage(bi, fl); //Produces the "clicking" effect fg.setAlwaysOnTop(true); fg.toFront(); fg.fire(); times--; } else t.stop(); } }); } public void fire() { t.start(); } public void saveImage(BufferedImage source, File destination) { System.out.println("Inside saveimage"); if(destination.isDirectory()) { System.out.println("destination: "+destination.getAbsolutePath()); String tmp = destination.getAbsolutePath() + File.separator + "Screenshot"; String str; int i=1; for(str=tmp; (new File(str+".png").exists()); i++) { str = tmp + "_" + String.valueOf(i); System.out.println("trying: "+str); } try { ImageIO.write(source, "png", new File(str+".png")); } catch (IOException e) { e.printStackTrace(); } } } public BufferedImage capture() { System.out.println("Captured"); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); return r.createScreenCapture(new Rectangle(d)); } public static void main(String arg[]) { //click 4 times each at an interval of 2 seconds FullScreen f = new FullScreen(4,2); f.fire(); while(f.t.isRunning()); } }

FullScreenGUI.java

1 个答案:

答案 0 :(得分:4)

问题的根源是Thread.sleep(50);

不要阻止EDT(事件调度线程) - 当发生这种情况时,GUI将“冻结”。而不是调用Thread.sleep(n)为此任务实现Swing Timer。有关详细信息,请参阅Concurrency in Swing