swing timer用法一:实现图片滑动,遇见窗口边界弹回




     计时器在java.swing包中的Timer类来创建,它可以看做是GUI的一个组件。与其他组件不一样的是,它没有可以显示在屏幕上的直观的外观。正如名字所表达的,它只帮我们来计时。
计时器对象按相等的时间间隔来产生动作事件。执行动画程序时,可以设置计时器来定期产生动作事件,然后在动作监听器中更新动画图形。

下面来点实际的例子,例子要完成的是:一张图片在窗口内按一定的角度滑行,碰到窗口的边界时在弹回来。(类似XP下的某个屏保)

ReboundPanel.java

import  java.awt.Color;
import  java.awt.Dimension;
import  java.awt.Graphics;
import  java.awt.event.ActionEvent;
import  java.awt.event.ActionListener;
import  javax.swing.ImageIcon;
import  javax.swing.JFrame;
import  javax.swing.JPanel;
import  javax.swing.Timer;

/**
 *  演示如何使用Timer 这个类来完成Swing的动画效果。
 * 
@author  guanminglin <guanminglin@gmail.com>
 
*/
public   class  ReboundPanel  extends  JPanel {

    
private   final   int  panelWidth  =   300 , panelHeight  =   200 ;
    
private   final   int  DELAY  =   20 , IMAGE_SIZE  =   35 ;
    
private  ImageIcon image;
    
private  Timer timer;
    
private   int  x, y, moveX, moveY;

    
/**
     * 面板构造函数,初始化面板。包括Timer 的场景。
     
*/
    
public  ReboundPanel() {
        timer 
=   new  Timer(DELAY,  new  ReboundListener());
        image 
=   new  ImageIcon( " images/1.gif " );
        x 
=   0 ;
        y 
=   40 ;
        moveX 
=  moveY  =   3 ;
        setPreferredSize(
new  Dimension(panelWidth, panelHeight));
        setBackground(Color.BLACK);
        timer.start();

    }

    
/**
     *  绘出图像在面板中的位置。
     * 
@param  page
     
*/
    @Override
    
public   void  paintComponent(Graphics page) {
        
super .paintComponent(page);
        image.paintIcon(
this , page, x, y);
       
    }

    
// Swing 动画,不断的更新图像的位置,已达到动画的效果。
     private   class  ReboundListener  implements  ActionListener {

        
public   void  actionPerformed(ActionEvent e) {
            x 
+=  moveX;
            y 
+=  moveY;
            
if  (x  <=   0   ||  x  >=  panelWidth  -  IMAGE_SIZE) {
                moveX 
=  moveX  *  ( - 1 );
            }
            
if  (y  <=   0   ||  y  >=  panelHeight  -  IMAGE_SIZE) {
                moveY 
=  moveY  *  ( - 1 );
            }
            repaint();
        }
    }

    
public   static   void  main(String[] args) {
        JFrame frame 
=   new  JFrame( " Rebound " );
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(
new  ReboundPanel());
        frame.pack();
        frame.setVisible(
true );
    }
}


     在程序中,类ReboundPanel 类的构造方法创建了一个定时器(Timer)对象,Timer构造方法的第一个参数是延迟时间(也就是间隔时间),第二个参数是要处理计时器动作事件的监听器。构造方法中还设置了图像的初始位置,及每次移动是垂直和水平方向的像素变化量。

     监听器的actionPerformed()方法更新当前的x和y坐标,然后检查它是否会令图像撞到面板的边界。如果撞上,则调整运动方向,让图像按与原水平、垂直或者两者的反方向运动。更新坐标值后,actionPerformed() 方法调用repaint方法重绘组件。调用repaint方法最终又会调用paintComponent方法,它在新的位置重绘图像。
最终效果如下:

原文地址:http://gml520.iteye.com/blog/394313

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值