A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张亚青 于 2013-3-22 13:19 编辑

  1. package main;

  2. /**
  3. * 该类实现传入组件的震动效果
  4. * 该类被PlayFrame调用
  5. *
  6. * 该类创建时
  7. *                         new ComponentEarthquakeCenter(Container d)        
  8. *                         参数d接受组件对象
  9. * 然后通过如下函数实现功能
  10. *                                 public void startShake()        功能:使传入组件开始震动
  11. *                                 
  12. *
  13. *
  14. *
  15. *
  16. * */

  17. import javax.swing.*;
  18. import java.awt.*;
  19. import java.awt.event.*;

  20. public class ComponentEarthquakeCenter
  21. {
  22.         public static final int SHAKE_DISTANCE =15;//震动时离开最初位置最大距离
  23.         public static final double SHAKE_CYCLE=40;//震动周期
  24.         public static final int SHAKE_DURATION=1000;//震动时长
  25.         public static final int SHAKE_UPDATE=15;//震动刷新频率
  26.         
  27.         private Container component;
  28.         private Point naturalLocation;//组件的最初位置
  29.         private long startTime;
  30.         private Timer shakeTimer;
  31.         //private final double HALF_PI=Math.PI/2;
  32.         private final double TWO_PI=Math.PI*2;
  33.         
  34.         public ComponentEarthquakeCenter(Container d)
  35.         {
  36.                 component=d;
  37.         }
  38.         /**
  39.          * 开始震动
  40.          *
  41.          * */
  42.         public void startShake()
  43.         {
  44.                 naturalLocation=component.getLocation();
  45.                 startTime=System.currentTimeMillis();
  46.                 shakeTimer=
  47.                                 new Timer(SHAKE_UPDATE,
  48.                                                         new ActionListener()
  49.                                                         {
  50.                                                                 public void actionPerformed(ActionEvent e)//利用三角函数模拟震动效果
  51.                                                                 {
  52.                                                                         long elapsed=System.currentTimeMillis()-startTime;
  53.                                                                         double waveOffset=(elapsed%SHAKE_CYCLE)/SHAKE_CYCLE;
  54.                                                                         double angle =waveOffset*TWO_PI;
  55.                                                                         
  56.                                                                         int shakenX=(int)((Math.sin(angle)*SHAKE_DISTANCE)+naturalLocation.x);
  57.                                                                         component.setLocation(shakenX,naturalLocation.y);
  58.                                                                         component.repaint();
  59.                                                                         
  60.                                                                         if(elapsed>=SHAKE_DURATION)
  61.                                                                                 stopShake();
  62.                                                                         
  63.                                                                 }
  64.                                                         });
  65.                 shakeTimer.start();
  66.                
  67.         }
  68.         /**
  69.          *
  70.          * 停止震动
  71.          */
  72.         private void stopShake()
  73.         {
  74.                 shakeTimer.stop();
  75.                 component.setLocation(naturalLocation);
  76.                 component.repaint();
  77.         }

  78.         /***/
  79.         public static void main(String[] args )
  80.         {
  81.                 JOptionPane pane=
  82.                                 new JOptionPane("",JOptionPane.ERROR_MESSAGE,JOptionPane.OK_OPTION);
  83.                 JDialog d=pane.createDialog(null,"shakin'!'");
  84.                 ComponentEarthquakeCenter dec=new ComponentEarthquakeCenter(d);
  85.                 d.pack();
  86.                 d.setModal(false);
  87.                 d.setVisible(true);
  88.                 dec.startShake();
  89.                
  90.                 while(pane.getValue()==JOptionPane.UNINITIALIZED_VALUE)
  91.                 {
  92.                         try{Thread.sleep(100);}
  93.                         catch(InterruptedException e){}
  94.                         
  95.                 }
  96.                 System.exit(0);
  97.         }
  98.         
  99. }
复制代码
求高手给指点一下代码中是否有问题,或者是否有更好的方法实现组建的震动效果。

点评

如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-22 12:36

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

1 个回复

正序浏览
看不出啥问题,不过不好玩,我给他改了一下,鼠标一旦想要按确定就震动!
当然我限制了一下,第三次移进去它就不会跑了,不然好像会出奇怪的问题{:soso_e120:}
  1. package netagain;

  2. import javax.swing.*;
  3. import java.awt.*;
  4. import java.awt.event.*;

  5. public class ComponentEarthquakeCenter
  6. {
  7.        public static final int SHAKE_DISTANCE =250;//震动时离开最初位置最大距离
  8.        public static final double SHAKE_CYCLE=10;//震动周期
  9.        public static final int SHAKE_DURATION=1000;//震动时长
  10.        public static final int SHAKE_UPDATE=10;//震动刷新频率
  11.       
  12.        private Container component;
  13.        private Point naturalLocation;//组件的最初位置
  14.        private long startTime;
  15.        private Timer shakeTimer;
  16.        //private final double HALF_PI=Math.PI/2;
  17.        private final double TWO_PI=Math.PI*2;
  18.       
  19.        public ComponentEarthquakeCenter(Container d)
  20.        {
  21.                component=d;
  22.        }
  23.        /**
  24.         * 开始震动
  25.         *
  26.         * */
  27.        public void startShake()
  28.        {
  29.                naturalLocation=component.getLocation();
  30.                startTime=System.currentTimeMillis();
  31.                shakeTimer=new Timer(SHAKE_UPDATE,new ActionListener()
  32.                {
  33.                        public void actionPerformed(ActionEvent e)//利用三角函数模拟震动效果
  34.                        {
  35.                        long elapsed=System.currentTimeMillis()-startTime;
  36.                        double waveOffset=(elapsed%SHAKE_CYCLE)/SHAKE_CYCLE;
  37.                        double angle =waveOffset*TWO_PI;
  38.                                                                      
  39.                        int shakenX=(int)((Math.sin(angle)*SHAKE_DISTANCE)+naturalLocation.x);
  40.                        int shakenY=(int)((Math.cos(angle)*SHAKE_DISTANCE)+naturalLocation.y);
  41.                        component.setLocation(shakenX,shakenY);
  42.                        component.repaint();
  43.                                                                      
  44.                        if(elapsed>=SHAKE_DURATION)
  45.                                stopShake();
  46.                                                                      
  47.                    }
  48.                });
  49.                shakeTimer.start();
  50.               
  51.        }
  52.        /**
  53.         *
  54.         * 停止震动
  55.         */
  56.        private void stopShake()
  57.        {
  58.                shakeTimer.stop();
  59.                component.setLocation(naturalLocation);
  60.                component.repaint();
  61.        }

  62.        /***/
  63.        public static void main(String[] args )
  64.        {
  65.                JOptionPane pane=
  66.                                new JOptionPane("",JOptionPane.ERROR_MESSAGE,JOptionPane.OK_OPTION);
  67.                JDialog d=pane.createDialog(null,"shakin'!'哈哈哈哈哈哈!!");
  68.                final ComponentEarthquakeCenter dec=new ComponentEarthquakeCenter(d);
  69.                d.pack();
  70.                d.setModal(false);
  71.                d.setVisible(true);
  72.                
  73.                pane.addMouseListener(new MouseAdapter()
  74.                {
  75.                        private int count = 1;
  76.                       
  77.                        public void mouseEntered(MouseEvent e)
  78.                        {
  79.                                count++;
  80.                                if(count>3)
  81.                                        return;
  82.                                dec.startShake();
  83.                               
  84.                        }
  85.                }
  86.                );
  87.                
  88.               
  89.                while(pane.getValue()==JOptionPane.UNINITIALIZED_VALUE)
  90.                {
  91.                        try{Thread.sleep(100);}
  92.                        catch(InterruptedException e){}
  93.                      
  94.                }
  95.                System.exit(0);
  96.        }
  97.       
  98. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马