• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JComboBoxにAnimated GIFを表示する
#navi(../)
RIGHT:Posted by &author(aterai); at 2012-03-12
*JComboBoxにAnimated GIFを表示する [#tf47b649]
JComboBoxと、そのドロップダウンリストにAnimated GIFを表示します。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(https://lh3.googleusercontent.com/-kS7gIhaebeM/T12ukNN94JI/AAAAAAAABJ8/wM8SvLNzWEE/s800/AnimatedIconInComboBox.png)

**サンプルコード [#ra30b4ca]
#code(link){{
private static ImageIcon makeImageIcon(URL url, final JComboBox combo, final int row) {
  ImageIcon icon = new ImageIcon(url);
  //Wastefulness: icon.setImageObserver(combo);
  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) {
      if(combo.isShowing() && (infoflags & (FRAMEBITS|ALLBITS)) != 0) {
        if(combo.getSelectedIndex()==row) {
          combo.repaint();
        }
        BasicComboPopup p = (BasicComboPopup)combo.getAccessibleContext().getAccessibleChild(0);
        JList list = p.getList();
        if(list.isShowing()) {
          list.repaint(list.getCellBounds(row, row));
        }
      }
      return (infoflags & (ALLBITS|ABORT)) == 0;
    };
  });
  return icon;
}
}}

**解説 [#ff36f816]
- JComboBox自体が非表示(JComboBox#isShowing(...)==false)の場合は、再描画しない
- Animated GIFが選択されている(JComboBox#getSelectedIndex()==row)場合のみ、JComboBox#repaint()で再描画する
- ドロップダウンリストが表示されている場合、Animated GIFの表示されている領域(JList#getCellBounds(row, row)で取得)だけ再描画

**参考リンク [#s0602434]
- [[JTableのセルにAnimated GIFを表示する>Swing/AnimatedIconInTableCell]]

**コメント [#oef480dc]
#comment