最近在学习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);
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
在程序中,类ReboundPanel 类的构造方法创建了一个Timer对象,Timer构造方法的第一个参数是延迟时间(也就是间隔时间),第二个参数是要处理Timer动作事件的监听器。构造方法中还设置了图像的初始位置,及每次移动是垂直和水平方向的像素变化量。
监听器的actionPerformed()方法更新当前的x和y坐标,然后检查它是否会令图像撞到面板的边界。如果撞上,则调整运动方向,让图像按与原水平、垂直或者两者的反方向运动。更新坐标值后,actionPerformed() 方法调用repaint方法重绘组件。调用repaint方法最终又会调用paintComponent方法,它在新的位置重绘图像。
最终效果如下:
【编辑推荐】