• category: swing folder: AnimatedIconInTableCell title: JTableのセルにAnimated GIFを表示する tags: [JTable, ImageIcon, ImageObserver, Animation] author: aterai pubdate: 2012-03-05T01:22:05+09:00 description: ImageIconにImageObserverを設定して、JTableのセル中でAnimated GIFのアニメーションを行います。 image: https://lh3.googleusercontent.com/-138Snht85-E/T1B6iHoG1pI/AAAAAAAABJw/XaESowuWEC4/s800/AnimatedIconInTableCell.png

概要

ImageIconImageObserverを設定して、JTableのセル中でAnimated GIFのアニメーションを行います。

サンプルコード

ImageIcon icon = new ImageIcon(url);
// Wastefulness: icon.setImageObserver((ImageObserver) table);
icon.setImageObserver(new ImageObserver() {
  // @see http://www2.gol.com/users/tame/swing/examples/SwingExamples.html
  @Override public boolean imageUpdate(
      Image img, int infoflags, int x, int y, int w, int h) {
    //@see javax.swing.JLabel#imageUpdate(...)
    if (!table.isShowing()) {
      return false;
    }
    // @see java.awt.Component#imageUpdate(...)
    if ((infoflags & (FRAMEBITS|ALLBITS)) != 0) {
      int vr = table.convertRowIndexToView(row); // JDK 1.6.0
      int vc = table.convertColumnIndexToView(col);
      table.repaint(table.getCellRect(vr, vc, false));
    }
    return (infoflags & (ALLBITS | ABORT)) == 0;
  };
});
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、AnimatedIconTableExample.javaを参考にして、Animated GIFファイルから作成したImageIconに、setImageObserver(ImageObserver)を設定しています。直接JTableImageObserverとして設定するとすべてのセルが再描画されて無駄なので、JTable#getCellRect(row, col, false)で対象セルのみrepaintするようにしています。

参考リンク

コメント