之前讲过了好友列表的闪烁,消息来临的时候,能第一时间知道,但是有时候消息太多了,实在没看到,QQ还提供了一个必杀技——窗体抖动,这个功能也非常的好用,给好友发送抖动窗口了之后,直接强制将聊天窗口弹出来,并且在屏幕上抖一抖,这样总该能看到消息了。
今天来教大家如何让swing窗体也抖动起来,实现原理非常的简单,上一篇文章中讲过好友头像的闪烁,就是动态改变窗体的坐标,还需要加入一个循环,让抖动的效果持续一会儿。
好了,没多少要说的,直接给代码了:
package com.wolffy.frame;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* Created by SongFei on 2017/12/19.
*/
public class ShakeFrame extends JFrame {
private JPanel jPanel;
private JButton jButton;
private long shakeTime;
public ShakeFrame() {
initGUI();
}
private void initGUI() {
setSize(700, 400);
//setUndecorated(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
jPanel = new JPanel();
getContentPane().add(jPanel, BorderLayout.CENTER);
jButton = new JButton("抖动");
jPanel.add(jButton);
jButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
shake();
}
});
}
/**
* 抖动窗体,原理就是动态改变窗体坐标,跟好友头像闪动一样
*/
private void shake() {
try {
// 校验操作是否过于频繁,5秒内不能再次抖动
long currentTime = System.currentTimeMillis();
if (currentTime - shakeTime <= 5000) {
System.err.println("抖动过于频繁");
return;
}
// 抖动成功之后,需要记录时间,下次做判断
shakeTime = currentTime;
// 窗体在屏幕上所在的初始坐标
int x = this.getX();
int y = this.getY();
// 抖动多少次,不宜太多,也不宜太少
for (int i = 0; i < 20; i++) {
// System.out.println(i & 1);
// i & 1,这个作用是奇偶分开
if ((i & 1) == 0) {
x += 3;
y += 3;
} else {
x -= 3;
y -= 3;
}
// 改变窗体的坐标
this.setLocation(x, y);
// 睡一会儿,造成停顿的效果
Thread.sleep(50);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ShakeFrame shakeFrame = new ShakeFrame();
shakeFrame.setVisible(true);
//loginFrame.pack();
shakeFrame.setLocationRelativeTo(null);
}
}
抖动是坐标来回切换,循环中的判断条件打印出来,值如下图所示,类似于奇数和偶数分开,i % 2 == 0,也是可以实现的,大家想用哪种都行
QQ抖动时点快了会给出提示,这里也模拟了一下,很简单,就是记录一下时间,然后下次点击的时候来比对这个时间,看看是否过于短暂
基本上就这些了,大家直接copy代码来运行看效果吧!