js 节流函数的核心思想:
防止频繁的执行,
最后的操作(的影响)覆盖掉之前的操作(的影响).
实现方式:延迟执行(有点像"推迟满足感")
这种实现方式让我想到了之前我做的swing窗口空闲多久就自动关闭的功能
具体思路:
(1)swing不是当前窗口时,开始启动定时器,
protected void windowDeactivated2(GenericFrame frame){ if (isLocked) {// over three times and is still locked,meanwhile use // try to log in if (task != null) { // System.out.println("取消任务"); task.cancel(); task = null; } } else {// first into this if clause(if (timesFail >= // LoginUtil.MAX_LOGIN_FAIL_TIMES )) task = null; } if (timer == null) { timer = new Timer(); } if (task == null) { task = new MyTask(frame); } timer.schedule(task, MILLISECONDS_WAIT_WHEN_BLUR*1000); // System.out.println("开始计时(second):"+TimeHWUtil.formatDateZhAll(TimeHWUtil.getCurrentTimestamp())); // System.out.println("定时时间(second):"+MILLISECONDS_WAIT_WHEN_BLUR); isLocked = true; }
public void windowDeactivated(WindowEvent e) {
setActived22(false);
//System.out.println("window Deactivated");
if(isTiming){
windowDeactivated2(frame);
}
super.windowDeactivated(e);
}
(2)在定时器等待的过程中,如果激活了swing窗口,那么取消定时器,
public void windowActivated(WindowEvent e) { setActived22(true); System.out.println("window Activated"); if (task != null) { // System.out.println("取消任务"); task.cancel(); task = null; } GenericFrame.this.setTiming(true);//恢复,不然后面就不会定时了. super.windowActivated(e); }
(3)如果不是当前窗口,则先取消定时器,再执行(1),即重新定时.
说明:swing窗口是当前窗口时,执行windowActivated 方法
参考:http://hw1287789687.iteye.com/blog/2311976