Re: simple animation question (I hope)
 
John Doe wrote:
Hi. Lets say I have 3 images (image1.jpg, image2,jpg and image3.jpg).
What is the simplest way to show image1.jpg in a table cell, then 1
second later - image2.jpg, then 1 second later - image3.jpg?
I'm trying to create a time counter showing elapsed time, or maybe time
left in a graphical way, say as a bar that moves, or maybe a little dot
that moves each second. I would like to show that animation in a table
cell. Something like that.
/*
With an immense help from guru camickr as shown on:
http://forum.java.sun.com/thread.jspa?messageID=4472998
*/
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
public class AnimeTableCell{
  JFrame frame;
  Container con;
  JScrollPane scp;
  JTable table;
  AnimePanel anp, ant;
  Image[] images;
  public AnimeTableCell(){
    frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    con = frame.getContentPane();
    images = new Image[4];
    images[0] = new ImageIcon("images/a.png").getImage();
    images[1] = new ImageIcon("images/b.png").getImage();
    images[2] = new ImageIcon("images/c.png").getImage();
    images[3] = new ImageIcon("images/d.png").getImage();
    table = new JTable(10, 6){
      public Component prepareRenderer
       (TableCellRenderer renderer, int row, int column){
        Component c = super.prepareRenderer(renderer, row, column);
        if (row == 3 && column == 2){
          if (ant != null){
            c = ant;
          }
        }
        return c;
      }
    };
    scp = new JScrollPane(table);
    con.add(scp, BorderLayout.CENTER);
    ant = new AnimePanel(images, 500, true); //for cell renderer,
repaint table
    anp = new AnimePanel(images, 500, false); //this doesn't repaint
table
    con.add(anp, BorderLayout.SOUTH);
    frame.setSize(400, 400);
    frame.setVisible(true);
  }
  class AnimePanel extends JPanel implements ActionListener{
    Image[] imgs;
    int delay;
    boolean trepaint;
    int range;
    int idx;
    Timer timer;
    AbstractTableModel atb;
    public AnimePanel(Image[] ima, int de, boolean r){
      setPreferredSize
        (new Dimension(ima[0].getWidth(this), ima[0].getHeight(this)));
      imgs = ima;
      delay = de;
      trepaint = r;
      range = ima.length - 1;
      idx = 0;
      atb = (AbstractTableModel)(table.getModel());
      timer = new Timer(delay, this);
      timer.start();
    }
    public void actionPerformed(ActionEvent e){
      ++idx;
      if (idx > range){
        idx = 0;
      }
      repaint();
      if (table != null && trepaint){
        atb.fireTableCellUpdated(3, 2);
      }
    }
    public void paintComponent(Graphics g){
      super.paintComponent(g);
      g.drawImage(imgs[idx], 0, 0, this);
    }
  }
  public static void main(String[] args){
    new AnimeTableCell();
  }
}