2012-03-04 8 views
2

JComboBox에서 애니메이션 (GIF) 아이콘을 사용하려고합니다.JComboBox에서 애니메이션 GIF 사용

DefaultListCellRenderer는 JLabel을 기반으로하므로 ImageIcon은 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을 사용하려 : Java animated GIF without using a JLabel).

그게 비트 더 나은 아니지만 중 하나를 작동합니다. 아이콘은 드롭 다운이 표시되어있는 동안 마우스를 움직이면 표시됩니다. 그래서 모르겠지만 그것은 repaiting 문제라고 생각합니다.

이것은 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; 
} 

통화가 (재 검증) 및 JLabel.setIcon()의 코드를보고 영감을 얻었다) (다시 칠하는

페인트() 메소드는 정직뿐만 아니라입니다 :

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    if (image != null) 
    { 
    g.drawImage(image, 0, 0, this); 
    } 
} 

아이디어가 있으십니까? 나는 그 아이콘이 드롭 다운에 애니메이션으로 표시 될 필요는 없다. (좋을지라도) 정적 인 이미지를보고 싶다.

+0

에서 영감을받은 비슷한 질문에 대한 http://stackoverflow.com/questions/575782/how-to-display-animation-in-a-jtable-cell를 참조하십시오. –

답변

2

이 예는 AnimatedIconTableExample.java

import java.awt.*; 
import java.awt.image.*; 
import java.net.*; 
import javax.swing.*; 
import javax.swing.plaf.basic.*; 
class MainPanel { 
    public JComponent makeUI() { 
    JComboBox combo = new JComboBox(); 
    URL url1 = getClass().getResource("static.png"); 
    URL url2 = getClass().getResource("animated.gif"); 
    combo.setModel(new DefaultComboBoxModel(new Object[] { 
     new ImageIcon(url1), makeImageIcon(url2, combo, 1) 
    })); 
    JPanel p = new JPanel(); 
    p.add(combo); 
    return p; 
    } 
    private static ImageIcon makeImageIcon(
     URL url, final JComboBox combo, final int row) { 
    ImageIcon icon = new ImageIcon(url); 
    icon.setImageObserver(new ImageObserver() { 
     //http://www2.gol.com/users/tame/swing/examples/SwingExamples.html 
     //AnimatedIconTableExample.java 
     @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; 
    } 
    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override public void run() { 
     createAndShowGUI(); 
     } 
    }); 
    } 
    public static void createAndShowGUI() { 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    f.getContentPane().add(new MainPanel().makeUI()); 
    f.setSize(320, 240); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 
} 
+0

감사합니다. 완벽하게 작동합니다. –

+0

@ nice, 어디서 태어났다'(infoflags & (FRAMEBITS | ALLBITS)) – mKorbel

+0

@mKorbel에서 참조 : src/java/awt/Component.java # imageUpdate (...) – aterai