这是我到目前为止写的一个例子:
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();
}
}
我为 animals 中的每个项目添加了一个jpg jpg 的文件夹放在同一级别的(默认包)。我正在使用eclipse。
我的想法是让JComboBox能够显示仅 jpgs,同时使用我已编码的某些鼠标点击事件的字符串(但不报告只是为了缩短它)。
有人能解释我如何得到我想要的东西,也许修改我的代码以便我可以研究它吗?
答案 0 :(得分:2)
您需要向组合框提供自定义ListCellRenderer
,该组合框能够显示图像(以及您需要的其他信息)
有关详细信息,请参阅Providing a custom renderer
您可以使用ImageIO
API加载图片。您可能需要将结果包装在ImageIcon
中以便更轻松地呈现它,但这取决于您的API实现
我建议使用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
(因此dog
将是dog.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;
}
}