应用场合:替代弹出窗口来做操作成功的提示,更加人性化(弹出窗口不友好,还要手动去关闭)
ShakeThread.java
package org.bruce.locator.gui;
import java.awt.Point;
import java.awt.Window;
import java.util.Random;
/**
* @author yang3wei
* 抖动线程~
*/
public class ShakeThread extends Thread {
// 调用时振动的次数~
public static final int SHAKE_COUNT = 7;
// 振动作用的对象窗口~
private Window window;
public ShakeThread(Window window) {
// TODO Auto-generated constructor stub
this.window = window;
}
@Override
public void run() {
// TODO Auto-generated method stub
Random random = new Random();
int shakeCount = 0;
Point oldLoc, newLoc;
while (true) {
try {
// 振完后一睡不醒,节省 cpu,需要振动的时候就打断一下~
if (shakeCount <= 0) {
shakeCount = SHAKE_COUNT;
Thread.sleep(1000 * 3600 * 24); // 睡 24h~
}
oldLoc = window.getLocation();
switch (random.nextInt(4)) {
case 0:
newLoc = new Point(oldLoc.x + 1, oldLoc.y + 1); // 向右下振
break;
case 1:
newLoc = new Point(oldLoc.x - 1, oldLoc.y - 1); // 向左上振
break;
case 2:
newLoc = new Point(oldLoc.x + 1, oldLoc.y - 1); // 向右上振
break;
default:
newLoc = new Point(oldLoc.x - 1, oldLoc.y + 1); // 向左下振
break;
}
// 偏离~
window.setLocation(newLoc);
Thread.sleep(30);
// 复位~
window.setLocation(oldLoc);
Thread.sleep(30);
shakeCount --;
} catch (InterruptedException e) {
System.err.println("ShakeThread 被唤醒,执行抖动逻辑~");
}
}
}
}
ShakeThreadUsage.java
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import org.bruce.locator.gui.ShakeThread;
/**
* @author yang3wei
* ShakeThread 的用例
*/
public class ShakeThreadUsage extends JFrame {
private static final long serialVersionUID = 138848804948298554L;
private static final int STU_WIDTH = 400, STU_HEIGHT = 300;
private ShakeThread shakeThread;
/**
* Constructor~
*/
public ShakeThreadUsage() {
// 标题 + 尺寸~
this.setTitle(ShakeThreadUsage.class.getSimpleName());
this.setSize(STU_WIDTH, STU_HEIGHT);
// 居中~
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension dim = tk.getScreenSize();
this.setLocation((dim.width - STU_WIDTH)/2, (dim.height - STU_HEIGHT)/2);
// 启动抖动线程~
shakeThread = new ShakeThread(this);
shakeThread.start();
// 添加鼠标侦听,按下的时候就抖动窗口~
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
shakeThread.interrupt();
}
});
// 关闭 + 可见
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new ShakeThreadUsage();
}
}