使用Timer 作帧触发器绘制转动风扇动画

使用Timer 作帧触发器绘制转动风扇动画

        javax.swing.Timer在指定时间间隔触发一个或多个ActionEvent。一个示例用法是动画对象,它将Timer 用作绘制其帧的触发器。

         设置计时器的过程包括创建一个 Timer 对象,在该对象上注册一个或多个动作侦听器,以及使用 start 方法启动该计时器。例如,以下代码创建并启动一个每秒(该时间由Timer 构造方法的第一个参数指定)触发一次动作事件的计时器。Timer 构造方法的第二个参数指定接收计时器动作事件的侦听器。

int delay = 1000; //milliseconds
  ActionListener taskPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          //...Perform a task...
      }
  };
  new Timer(delay, taskPerformer).start();

         构造 Timer 时要指定一个延迟参数和一个 ActionListener。延迟参数用于设置初始延迟和事件触发之间的延迟(以毫秒为单位)。启动了计时器后,它将在向已注册侦听器触发第一个ActionEvent 之前等待初始延迟。第一个事件之后,每次超过事件间延迟时它都继续触发事件,直到被停止。构造之后,可以单独更改初始延迟和事件间延迟,并且可以添加其他ActionListener如果希望计时器只在第一次时触发然后停止,可以对计时器调用setRepeats(false)

        使用Timer 作帧触发器绘制转动风扇动画代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class RunningFan extends JFrame {
  public RunningFan() {
    add(new Fan());
  }


  public static void main(String[] args) {
	  RunningFan frame = new RunningFan();
    frame.setTitle("Running Fan");//将此窗体的标题设置为指定的字符串
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//使用 System exit 方法退出应用程序

    frame.setSize(400, 400);//调整组件的大小,使其宽度为 width,高度为 height
    frame.setLocationRelativeTo(null); // 设置窗口相对于指定组件的位置
    frame.setVisible(true);//显示或隐藏此 Window
  }
  
  class Fan extends JPanel {
    private int xCenter, yCenter;
	private int fanRadius, bladeLength;
	private int angle = 100;
	private int direction = 1;
	private int speed = 10;
	//创建一个 Timer 并将初始延迟和事件间延迟初始化为 speed 毫秒
	protected Timer timer = new Timer(speed, new TimerListener());

    public Fan() {
	  timer.start();//启动 Timer,使它开始向其侦听器发送动作事件。 
	}

	public void reverse() {
	  direction = -direction;
	}

    public void setSpeed(int ms) {
	  speed = ms;
	  timer.setDelay(speed);//设置 Timer 的事件间延迟,两次连续的动作事件之间的毫秒数
	}

    public void paintComponent(Graphics g) {
	  super.paintComponent(g);

      // 设置半径和中心
	  fanRadius = (int)(Math.min(getSize().width, getSize().height)*0.9*0.5);//风扇半径
	  xCenter = (getSize().width)/2;//风扇x坐标
	  yCenter = (getSize().height)/2;//风扇y坐标
	  bladeLength = (int)(fanRadius*0.99);//弧长
	  angle = (angle+direction)%360;

      // 绘制外圆
	  g.setColor(Color.blue);//设置为指定颜色
	  g.drawOval(xCenter - fanRadius,yCenter - fanRadius,
	    2*fanRadius, 2*fanRadius);//绘制椭圆的边框。

      // 绘制6个扇叶
	  drawBlade(g, angle+30);
	  drawBlade(g, angle+90);
	  drawBlade(g, angle+150);
	  drawBlade(g, angle+210);
	  drawBlade(g, angle+270);
	  drawBlade(g, angle+330);
	}
    
 // 绘制扇叶
	private void drawBlade(Graphics g, int angle) {
	  g.setColor(Color.blue);
	 // 填充覆盖指定矩形的圆弧或椭圆弧。 
	 //得到的弧从 startAngle 开始跨越 arcAngle 度。
	 // 弧的中心是矩形的中心,此矩形的原点为 (x, y),大小由 width 和 height 参数指定。
	  g.fillArc(xCenter-bladeLength, yCenter-bladeLength,
	    2*bladeLength, 2*bladeLength, angle, 30);
	}
	  
	class TimerListener implements ActionListener {
	  public void actionPerformed(java.awt.event.ActionEvent actionEvent) {
	    repaint();//重绘此组件
	  }
	}
  }
}
使用Timer 作帧触发器绘制转动风扇动画_第1张图片

 


你可能感兴趣的:(java)