2

这是我到目前为止写的一个例子:

import javax.swing.*;
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class program {

    JFrame win = new JFrame("bla bla");

    final private String[] animals = { "dog", "cat", "mouse" };

    private void Start() {
        JPanel superior = new JPanel();
        superior.setLayout(new GridLayout(3, 3));
        win.getContentPane().add(superior, BorderLayout.PAGE_START);
        final JComboBox<String> comboBox = new JComboBox<String>(animals);
        ((JLabel) comboBox.getRenderer()).setHorizontalAlignment(SwingConstants.CENTER);
        superior.add(comboBox);
        win.setSize(440, 290);
        win.setResizable(false);
        win.setLocationRelativeTo(null);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setVisible(true);
    }

    public static void main(String args[]) {
        program window = new program();
        window.Start();
    }
}

我在名为jpg的文件夹中的每个动物字符串数组项都有一个单独的 jpg,该文件夹位于(default package)的同一级别。我正在使用日食。

我的想法是让 JComboBox 能够显示jpg,同时使用带有我已经编码的某些鼠标单击事件的字符串(但不报告只是为了使其简短)。

我已经读过这个这个这个,但我无法真正完成工作:(

谁能解释我如何得到我想要的东西,也许修改我的代码以便我可以研究它?

4

1 回答 1

2

您需要ListCellRenderer为能够显示图像(以及您需要的其他信息)的组合框提供自定义

有关更多详细信息,请参阅提供自定义渲染器

ImageIO您可以使用API加载图像。您可能需要将结果包装在 aImageIcon中以便更轻松地呈现它,但这取决于您的 API 实现

我建议使用 a DefaultListCellRenderer,因为它从扩展而来JLabel,会让你的生活更轻松

非常简单的例子

我没有足够的信息来形成一个完全可运行的示例,但本质上,添加到组合框模型的值应该以某种方式包含对您要加载的图像的引用。

这样,在需要时,您可以提取图像并使用单元格渲染器显示它...

public class ImageCellRenderer extends DefaultListCellRenderer {

    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        if (value instanceof ??) {
            ImageIcon icon = ...;
            setIcon(icon);
        }
        return this;
    }

}

并应用渲染器...

JComboBox cb = new JComboBox();
cb.setRenderer(new ImageCellRenderer());

更新

现在假设图像被命名[animal].jpg(这样dogdog.jpg你应该能够构建一个简单的Map,将名称映射到动物图像......

// List of animals...
final private String[] animals = { "dog", "cat", "mouse" };

/*...*/

// Map of animal icons...
Map<String, Icon> mapImages = new HashMap<>();
// Build the icon image mapping
for (String animal : animals) {
    mapImages.put(animal, new ImageIcon(ImageIO.read(getClass().getResource("/" + animal + ".jpg))))
}

// Create a new cell renderer, passing the mappings
ImageCellRenderer renderer = new ImageCellRenderer(mapImages);

// Create a new combo box
JComboBox<String> comboBox = new JComboBox<String>(animals);
// Apply the renderer
comboBox.setRenderer(renderer);

/*...*/

public class ImageCellRenderer extends DefaultListCellRenderer {

    // Icon mappings
    private Map<String, Icon> mapImages

    public ImageCellRenderer(Map<String, Icon> mapImages) {
        // Make a new reference to the icon mappings
        this.mapImages = new HashMap<>(mapImages);
        setHorizontalAlignment(SwingConstants.CENTER);
    }

    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        if (value instanceof String) {
            // Look up the icon associated with the animal...
            Icon icon = mapImages.get(value.toString());
            setIcon(icon);
        }
        return this;
    }

}
于 2013-09-21T21:16:46.783 回答