java - 在 JComboBox 中使用动画 GIF

标签 java swing gif jcombobox animated

我正在尝试在 JComboBox 中使用动画 (GIF) 图标。

由于DefaultListCellRenderer是基于JLabel的,所以将ImageIcons放入ComboBoxModel中时直接支持ImageIcons。

但是这不适用于动画 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 )。

有点效果更好,但也不理想。仅当我在显示下拉菜单时将鼠标移到图标上时,才会显示图标。所以我猜这是一个重新修复的问题,虽然我不知道在哪里

这是我的 JPanel 中实现 ListCellRenderer 接口(interface)的部分。

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);
  }
}

有什么想法吗?我真的不需要这些图标在下拉菜单中设置动画(尽管这很好),但我至少希望看到静态图像。

最佳答案

这个例子的灵感来自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);
  }
}

关于java - 在 JComboBox 中使用动画 GIF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9555281/

相关文章:

java - LibGdx 中的输入 - 操作处理

java - JSplitPane:有没有办法显示/隐藏其中一个 Pane ?

java - 将其他组件添加到带背景的 JFrame

java - java中的条形码生成

optimization - 有没有类似 pngcrush 的 GIF 工具?

java - 项目 react 器超时

java - Spring批处理中的提交间隔和处理回滚

python - Gif 帧持续时间似乎比预期慢

java - NetBeans GUI 生成器 : Add gifs to label

java - 使用 Jena API 在 SPARQL 中自定义函数