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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

       学习Java也快半年,想想期初之所以走上这条不归路,还是在大学期间每次解决一道C语言的小试题都格外开心,不管怎么说始终认为编程本身就是一件很有趣味的事,随着开始学习Java , 貌似趣味性也随之变淡,于是乎在业余时间找些自己感兴趣的东西,试着去学习,也算为现在每天的学习生活添加一丝色彩。很喜欢Alan J. Perlls写在《计算机程序的构造和解释》一书前言上的一段话:


      言归正传,这一程序原是大学期间某同学恶搞发的,还蛮有意思,在查资料了解了下基本的API后,稍作整理,也算大家一起娱乐一下。以下是通过Java  AWT\Swing 写的一个简单桌面应用程序,先上效果吧:
      

     如图所示,我们要做的是在桌面上疯狂打印RMB,是不是感觉很爽,那么是怎么实现呢?其实我对Java AWT\Swing知识点还是不太熟,好在代码还是比较简单,稍微查下API还是可以搞定的。
     实现原理:截取一张屏幕大小的图片绘制为画布背景,再在该基础上无限随机绘制RMB.
     步奏分析:
      1.自定义一个面板(JFrame),去除标题栏,并且大小和屏幕一样大
      2.在该面板上添加画布(JPanel),将来所有的绘制都在该画布上进行
      3.截取屏幕图片作为画布背景
      4.覆写JFrame的 paint(Graphics g) 方法,该方法实现实际的绘制步奏
               ----先将截取的屏幕图片通过画笔g绘制到画布上
               ----无限循环绘制指定的RMB图片到随机的坐标上
     5.调用JFrame的 setVisible(true) 方将面板显示出来

     通过以上5步,就可实现上面效果,献上自定义JFrame代码,注释加的很详细,就不多做介绍了,测试代码在附件中下载即可:
  1. /**
  2. * 创建我们的自定义面板
  3. * */
  4. class WelfareJFrame extends JFrame {
  5.        
  6.         private Toolkit mToolkit;        //一个基本的工具包 , 可以获取屏幕分辨率
  7.         private List<Image> mImages;        //传入要显示的图片集合
  8.         private JPanel mJPanel;                //画布
  9.         private Image mScreenImage;        //截取的屏幕图片
  10.         private Random mRandom;                //随机数
  11.         private int sWidth;                        //屏幕宽度
  12.         private int sHeight;                //屏幕高度

  13.         public WelfareJFrame() throws AWTException {
  14.                 mRandom = new Random();
  15.                 mToolkit = Toolkit.getDefaultToolkit();
  16.                 mImages = new ArrayList<Image>();
  17.                 mJPanel = new JPanel(); // 创建画布
  18.                 getContentPane().add(mJPanel); // 在画板上添加画布

  19.                 Dimension dt = mToolkit.getScreenSize(); // 获得屏幕大小
  20.                 sWidth = dt.width; // 屏幕宽度
  21.                 sHeight = dt.height; // 屏幕高度

  22.                 mScreenImage = new Robot().createScreenCapture(new Rectangle(dt)); // 截取屏幕背景图片

  23.                 setUndecorated(true); // 去掉标题栏
  24.                 setSize(sWidth, sHeight); // 设置画板大小
  25.         }

  26.         /**
  27.          * 添加图片路径
  28.          * */
  29.         public WelfareJFrame addImgae(String locImagePath) {
  30.                 Image image = mToolkit.getImage(WelfareDemo.class
  31.                                 .getResource(locImagePath));
  32.                 mImages.add(image);
  33.                 return this;
  34.         }

  35.         /**
  36.          * 当调用setVisible(true)时 , 会调用该方法 利用画笔g 绘制画面
  37.          * */
  38.         @Override
  39.         public void paint(Graphics g) {

  40.                 g.drawImage(mScreenImage, 0, 0, this); // 先绘制背景图片

  41.                 // 无限绘制传入的图片
  42.                 while (true) {
  43.                         try {
  44.                                 Thread.sleep(200); // 休息200毫秒
  45.                         } catch (InterruptedException e) {
  46.                                 e.printStackTrace();
  47.                         }

  48.                         // 随机坐标绘制传入的图片
  49.                         for (int i = 0; i < mImages.size(); i++) {
  50.                                 g.drawImage(mImages.get(i),
  51.                                                 mRandom.nextInt(sWidth) - 200,
  52.                                                 mRandom.nextInt(sHeight) -200,
  53.                                                 null);
  54.                         }

  55.                 }
  56.         }
  57.        
  58.         /**
  59.          * 开始显示
  60.          * */
  61.         public void start() {
  62.                 this.setVisible(true); // 显示容器 【会自动调用paint()方法】
  63.         }
  64. }
复制代码






Welfare.zip

58.26 KB, 下载次数: 28

测试代码

4 个回复

倒序浏览
好像蠻有趣的,感謝分享
回复 使用道具 举报
加油!!
回复 使用道具 举报
。。。怎么停下来, 我只能按任务管理器。。
回复 使用道具 举报
好吧,tab一下就可以了 =L=
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马