JComboBox でアニメーション (GIF) アイコンを使用しようとしています。
DefaultListCellRenderer は JLabel に基づいているため、ImageIcons は ComboBoxModel に配置するときに直接サポートされます。
ただし、これはアニメーション GIF では機能しません。
ドロップダウンでは、それらが選択されていない限り、それらはまったく表示されません (通常の JLabel で使用される場合、GIF は機能します)。
コンボボックスに入力するコードは簡単です:
ImageIcon[] data = new ImageIcon[4];
data[0] = new ImageIcon("icon_one.gif");
data[1] = new ImageIcon("icon_two.gif");
data[2] = new ImageIcon("icon_three.gif");
data[3] = new ImageIcon("icon_four.gif");
ComboBoxModel model = new DefaultComboBoxModel(data);
setModel(model);
icon_one.gif は静的なもので、問題なく表示されます。他はアニメ化。(これらのアイコンのいずれかを JLabel に直接割り当てると、問題なく表示されるため、画像は正しく読み込まれます)
また、JPanel に基づいて独自の ListCellRenderer を使用しようとしました (この質問への回答に触発されました: JLabel を使用しない Java アニメーション GIF )。
それは少しうまくいきますが、理想的でもありません。アイコンは、ドロップダウンが表示されているときにマウスをアイコンの上に移動した場合にのみ表示されます。どこにあるのかわかりませんが、繰り返しの問題だと思います
これは、ListCellRenderer インターフェイスを実装する JPanel の一部です。
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
{
this.image = ((ImageIcon)value).getImage();
if (isSelected)
{
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}
else
{
setBackground(list.getBackground());
setForeground(list.getForeground());
}
revalidate();
repaint();
return this;
}
revalidate() と repaint() の呼び出しは、JLabel.setIcon() のコードを見て触発されました。
paint() メソッドも単純です。
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if (image != null)
{
g.drawImage(image, 0, 0, this);
}
}
何か案は?ドロップダウンでこれらのアイコンをアニメーション化する必要はありませんが(それはいいことですが)、少なくとも静的な画像を見たいと思います。