TITLE:Timerでアニメーションするアイコンを作成

Timerでアニメーションするアイコンを作成

編集者:Terai Atsuhiro
作成日:2006-03-13
更新日:2024-02-02 (金) 11:37:11

概要

javax.swing.Timerを使って、アニメーションするアイコンを作成します。

#screenshot

サンプルコード

class AnimeIcon extends JComponent implements ActionListener {
  private boolean flag = false;
  private final javax.swing.Timer animator;
  private final Vector list = new Vector();
  public void animationStart() {
    flag = true;
    animator.start();
  }
  public void animationStop() {
    flag = false;
    animator.stop();
  }
  public AnimeIcon() {
    super();
    animator = new javax.swing.Timer(100, this);
    //setBackground(Color.white);
    double r  = 2.0d;
    double sx = 1.0d;
    double sy = 1.0d;
    list.addElement(new Ellipse2D.Double(sx+3*r, sy+0*r, 2*r, 2*r));
    list.addElement(new Ellipse2D.Double(sx+5*r, sy+1*r, 2*r, 2*r));
    list.addElement(new Ellipse2D.Double(sx+6*r, sy+3*r, 2*r, 2*r));
    list.addElement(new Ellipse2D.Double(sx+5*r, sy+5*r, 2*r, 2*r));
    list.addElement(new Ellipse2D.Double(sx+3*r, sy+6*r, 2*r, 2*r));
    list.addElement(new Ellipse2D.Double(sx+1*r, sy+5*r, 2*r, 2*r));
    list.addElement(new Ellipse2D.Double(sx+0*r, sy+3*r, 2*r, 2*r));
    list.addElement(new Ellipse2D.Double(sx+1*r, sy+1*r, 2*r, 2*r));
    int iw = (int)(r*8)+(int)(sx*2);
    int ih = (int)(r*8)+(int)(sy*2);
    setPreferredSize(new Dimension(iw, ih));
  }
  public void paintComponent(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    g2d.setPaint(getBackground());
    g2d.fillRect(0, 0, getWidth(), getHeight());
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                         RenderingHints.VALUE_ANTIALIAS_ON);
    Iterator it = list.iterator();
    if(flag) {
      float alpha = 0.1f;
      while(it.hasNext()) {
        g2d.setPaint(new Color(0.5f,0.5f,0.5f,alpha));
        g2d.fill((Shape)it.next());
        alpha = alpha + 0.1f;
      }
    }else{
      while(it.hasNext()) {
        g2d.setPaint(new Color(0.6f,0.6f,0.6f));
        g2d.fill((Shape)it.next());
      }
    }
  }
  public void actionPerformed(ActionEvent e) {
    list.addElement(list.remove(0));
    repaint();
  }
}
  • &jnlp;
  • &jar;
  • &zip;

解説

上記のサンプルでは、円のアルファ値が変化するFireFox風のアニメーションアイコンを作成しています。

JTextAreaに表示している作業状況はダミーで、実際はThread.sleep()で時間を稼いでいるだけです。

円がいびつだったので、アンチエイリアスをかけています。Java SE 6 では、「小さな円(曲線)が円に見えなかった問題」が解消されているようです(参考)。

コメント

  • 色の濃い円が時計回りに回転するように変更しました。 -- terai