swing自制組件(二)
??? 在未來的幾天里,我將持續為大家更新swing的自制組件,全部都含有運行截圖和源代碼。方便大家互相交流。
??? 今天的自制組件屏幕震動組件。可以像QQ發送的抖動窗口一樣彈出震動
?
?
?
?
?
?
?
?
?
?
?
package com.tianlong.framework.component; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JDialog; import javax.swing.JOptionPane; import javax.swing.Timer; /** * 窗口抖動工具 * @author 翟天龍 * @version V1.0 2011-2-21 */ public class ShakeDialog extends Object { /** * 震幅 */ public static final int SHAKE_DISTANCE = 10; /** * 震動頻率 */ public static final double SHAKE_CYCLE = 50; /** * 震動持續時間 */ public static final int SHAKE_DURATION = 1000; /** * 初始延遲(毫秒) */ public static final int SHAKE_UPDATE = 5; /** * 要震動的Dialog */ private JDialog dialog; /** * 要震動的Dialog的左上角坐標 */ private Point naturalLocation; /** * 震動開始時間 */ private long startTime; /** * 時間觸發器 */ private Timer shakeTimer; /** * 正弦震幅 */ private final double TWO_PI = Math.PI * 2.0; /** * 構造方法 * @param d */ public ShakeDialog( JDialog d ) { dialog = d; } /** * 開始震動 */ public void startShake() { //獲得左上角的點 naturalLocation = dialog.getLocation(); //記錄開始時間 startTime = System.currentTimeMillis(); //初始化時間觸發器 shakeTimer = new Timer(SHAKE_UPDATE, new ActionListener() { public void actionPerformed(ActionEvent e) { //持續時間 long elapsed = System.currentTimeMillis() - startTime; //利用正弦計算出震動差值 double waveOffset = (elapsed % SHAKE_CYCLE) / SHAKE_CYCLE; //正弦震幅 double angle = waveOffset * TWO_PI; //左上角x坐標 int shakenX = (int) ((Math.sin(angle) * SHAKE_DISTANCE) + naturalLocation.x); dialog.setLocation(shakenX, naturalLocation.y); dialog.repaint(); //震動結束的判斷 if (elapsed >= SHAKE_DURATION) { stopShake(); } } }); shakeTimer.start(); } /** * 震動停止 */ public void stopShake() { shakeTimer.stop(); dialog.setLocation(naturalLocation); dialog.repaint(); } public static void main(String[] args) { JOptionPane pane = new JOptionPane("屏幕震動|屏幕震動|屏幕震動|屏幕震動|\n屏幕震動|屏幕震動|屏幕震動|屏幕震動", JOptionPane.INFORMATION_MESSAGE, JOptionPane.OK_OPTION); JDialog d = pane.createDialog(null, "屏幕震動!"); ShakeDialog dec = new ShakeDialog(d); d.pack(); d.setModal(false); d.setVisible(true); dec.startShake(); while (pane.getValue() == JOptionPane.UNINITIALIZED_VALUE) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } System.exit(0); } }
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
