最近在学习Swing中的动画绘制,用到了Timer 这个类,于是写一点笔记,和大家分享。大家有什么好的例子不妨共享出来吧!!
Timer在java.swing包中的Timer对象来创建,它可以看做是GUI的一个组件。与其他组件不一样的是,它没有可以显示在屏幕上的直观的外观。正如名字所表达的,它只帮我们来计时。
Timer对象按相等的时间间隔来产生动作事件。执行动画程序时,可以设置Timer来定期产生动作事件,然后在动作监听器中更新动画图形。
下面来点实际的例子,例子要完成的是:一张图片在窗口内按一定的角度滑行,碰到窗口的边界时在弹回来。
- importjava.awt.Color;
- importjava.awt.Dimension;
- importjava.awt.Graphics;
- importjava.awt.event.ActionEvent;
- importjava.awt.event.ActionListener;
- importjavax.swing.ImageIcon;
- importjavax.swing.JFrame;
- importjavax.swing.JPanel;
- importjavax.swing.Timer;
- /**
- *演示如何使用Timer这个类来完成Swing的动画效果。
- *@authorguanminglin<guanminglin@gmail.com>
- */
- publicclassReboundPanelextendsJPanel{
- privatefinalintpanelWidth=300,panelHeight=200;
- privatefinalintDELAY=20,IMAGE_SIZE=35;
- privateImageIconimage;
- privateTimertimer;
- privateintx,y,moveX,moveY;
- /**
- *面板构造函数,初始化面板。包括Timer的场景。
- */
- publicReboundPanel(){
- timer=newTimer(DELAY,newReboundListener());
- image=newImageIcon("images/1.gif");
- x=0;
- y=40;
- moveX=moveY=3;
- setPreferredSize(newDimension(panelWidth,panelHeight));
- setBackground(Color.BLACK);
- timer.start();
- }
- /**
- *绘出图像在面板中的位置。
- *@parampage
- */
- @Override
- publicvoidpaintComponent(Graphicspage){
- super.paintComponent(page);
- image.paintIcon(this,page,x,y);
- }
- //Swing动画,不断的更新图像的位置,已达到动画的效果。
- privateclassReboundListenerimplementsActionListener{
- publicvoidactionPerformed(ActionEvente){
- x+=moveX;
- y+=moveY;
- if(x<=0||x>=panelWidth-IMAGE_SIZE){
- moveXmoveX=moveX*(-1);
- }
- if(y<=0||y>=panelHeight-IMAGE_SIZE){
- moveYmoveY=moveY*(-1);
- }
- repaint();
- }
- }
- publicstaticvoidmain(String[]args){
- JFrameframe=newJFrame("Rebound");
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.add(newReboundPanel());
- frame.pack();
- frame.setVisible(true);
- }
- }
在程序中,类ReboundPanel 类的构造方法创建了一个Timer对象,Timer构造方法的第一个参数是延迟时间(也就是间隔时间),第二个参数是要处理Timer动作事件的监听器。构造方法中还设置了图像的初始位置,及每次移动是垂直和水平方向的像素变化量。
监听器的actionPerformed()方法更新当前的x和y坐标,然后检查它是否会令图像撞到面板的边界。如果撞上,则调整运动方向,让图像按与原水平、垂直或者两者的反方向运动。更新坐标值后,actionPerformed() 方法调用repaint方法重绘组件。调用repaint方法最终又会调用paintComponent方法,它在新的位置重绘图像。
最终效果如下:
【编辑推荐】