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

Java:截图后获得照片点击效果,java,swing,screenshot,Java,Swing,Screenshot,我编写了两个类,FullScreen,其中包含屏幕截图的逻辑,以及FullScreenGUI,其中包含模拟照片点击效果的逻辑 照片点击效果基本上是在短时间内以白色闪烁屏幕,比如截图后50毫秒。它是由一个不透明度为1%的JFrame覆盖整个屏幕产生的。背景为白色,然后不透明度从1%更改为100%,保持50毫秒不变,然后恢复为1% FullScreen构造函数采用两个参数,一个用于截图次数,另一个用于截图之间的持续时间 FullScreenGUI构建一个JFrame,将其最大化,将背景设置为白色。调

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

照片点击效果基本上是在短时间内以白色闪烁屏幕,比如截图后50毫秒。它是由一个不透明度为1%的
JFrame
覆盖整个屏幕产生的。背景为白色,然后不透明度从1%更改为100%,保持50毫秒不变,然后恢复为1%

FullScreen
构造函数采用两个参数,一个用于截图次数,另一个用于截图之间的持续时间

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

问题:

使用下面的代码,我能够在第一次截图时产生效果,但在随后的点击中不会产生效果。假设使用参数
(4,2)
调用了
全屏
构造函数(即在2秒的持续时间内每次点击4次),则第一次点击效果良好,但其余3次点击效果不佳<
FullScreenGUI
的code>JFrame似乎没有出现在前面,因此效果不明显。我尝试了
JFrame.setAlwaysOnTop(true)
JFrame.toFront()
,但它们似乎没有将
JFrame
带到顶端

截图没有问题,但是效果很好。你还有其他的想法来制作它吗

以下是代码:
FullScreen.java

import java.awt.*;
导入java.awt.event.*;
导入java.awt.image.buffereImage;
导入java.io.*;
导入javax.imageio.imageio;
导入javax.swing.Timer;
导入javax.swing.filechooser.FileSystemView;
全屏上课
{   
int次,持续时间;
定时器t;
机器人r;
缓冲图像bi;
全屏图形用户界面;
全屏(整数时间、整数持续时间)
{
fg=新的FullScreenGUI();
fg.setVisible(真);
this.times=tim;
这个。持续时间=持续时间;
试一试{
r=新机器人();
}捕获(awtexe){
e、 printStackTrace();
}
System.out.println(“内部构造函数”);
t=新计时器(持续时间*1000,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件arg0){
System.out.println(“内部行动”);
如果(次数>0)
{
System.out.println(“次:+次);
//截图
bi=捕获();
//提供主目录的路径。对于windows,它将转到您的桌面
FileSystemView filesys=FileSystemView.getFileSystemView();
File fl=filesys.getHomeDirectory();
saveImage(bi,fl);
//产生“点击”效果
fg.setAlwaysOnTop(真);
fg.toFront();
fg.火();
时代--;
}
其他的
t、 停止();
}
});
}
公共场所火灾()
{
t、 start();
}
public void saveImage(buffereImage源、文件目标)
{
System.out.println(“内部保存图像”);
if(destination.isDirectory())
{
System.out.println(“目的地:+destination.getAbsolutePath());
字符串tmp=destination.getAbsolutePath()+File.separator+“屏幕截图”;
字符串str;
int i=1;
for(str=tmp;(新文件(str+“.png”).exists();i++)
{
str=tmp+“”+字符串.valueOf(i);
System.out.println(“trying:+str”);
}
试一试{
write(源代码,“png”,新文件(str+“.png”);
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
公共缓冲区图像捕获()
{
系统输出打印项次(“捕获”);
维度d=Toolkit.getDefaultToolkit().getScreenSize();
返回r.createScreenscapture(新矩形(d));
}
公共静态void main(字符串arg[])
{
//每次单击4次,间隔2秒
全屏f=新全屏(4,2);
f、 火();
而(f.t.正在运行());
}
}
FullScreenGUI.java

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
类FullScreenGUI扩展了JFrame{
FullScreenGUI()
{
setExtendedState(JFrame.MAXIMIZED_两者);
未装饰的设置(真实);
可设置大小(假);
不透明度(0.01f);
setAlwaysOnTop(真);
setLayout(新的BorderLayout());
JLabel jl=新的JLabel();
jl.立根台(颜色:白色);
添加(jl);
setDefaultCloseOperation(关闭时退出);
}
公共场所火灾()
{
System.out.println(“单击”);
setVisible(真);
试一试{
不透明度(1f);
睡眠(50);
不透明度(0.1f);
}catch(异常e){e.printStackTrace();}
setVisible(假);
}
}

问题的根源是
线程睡眠(50)


不要阻止EDT(事件调度线程)-发生这种情况时,GUI将“冻结”。不要调用
Thread.sleep(n)
为该任务实现一个Swing
计时器。有关更多详细信息,请参阅

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


不要阻止EDT(事件调度线程)-发生这种情况时,GUI将“冻结”。不要调用
Thread.sleep(n)
为该任务实现一个Swing
计时器。有关更多详细信息,请参阅

-),我确定EDT必须被冻结,请看我删除的帖子中的链接帖子,Swing Timer是反作用的,快乐的Christmast到世界上最容易的角落是的!谢谢祝你们俩圣诞快乐!:-)明天不是圣诞节吗,伙计们P现在是2012年12月24日04:44