如何使用Map元素作为JComboBox的文本

我正在使用集合的所有元素填充JComboBox(使用addItem() )。 集合中的每个元素都是一个HashMap (所以它是一个Hashmaps的ComboBox ..)。

我的问题是 – 鉴于我需要每个项目都是HashMap如何在GUI上的combobox中将文本设置为apear? 它必须是地图中某个键的值。 通常,如果我使用自己的类型填充combobox,我只会覆盖toString()方法…但我不知道如何实现这一点,因为我使用的是Java HashMap。

任何想法(如果可能的话,没有实现我自己的HashMap)?

更新 :似乎没有办法避免让对象在JComboBox上覆盖toString()如果我想要自定义function..我希望有一种方法可以(1)指定要加载到JComboBox中的对象和( 2)指定这些对象在GUI中的显示方式。

(2)指定这些对象在GUI中的显示方式。

您可以将任何对象添加到模型中,然后创建自定义渲染器以任何方式显示对象。 显示toString()方法和自定义渲染器方法的简单示例:

 import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.plaf.basic.*; public class ComboBoxItem extends JFrame implements ActionListener { public ComboBoxItem() { Vector model = new Vector(); model.addElement( new Item(1, "car" ) ); model.addElement( new Item(2, "plane" ) ); model.addElement( new Item(3, "train" ) ); model.addElement( new Item(4, "boat" ) ); JComboBox comboBox; // Easiest approach is to just override toString() method // of the Item class comboBox = new JComboBox( model ); comboBox.setDragEnabled(true); comboBox.addActionListener( this ); getContentPane().add(comboBox, BorderLayout.NORTH ); // Most flexible approach is to create a custom render // to diplay the Item data comboBox = new JComboBox( model ); comboBox.setDragEnabled(true); comboBox.setRenderer( new ItemRenderer() ); comboBox.addActionListener( this ); getContentPane().add(comboBox, BorderLayout.SOUTH ); } public void actionPerformed(ActionEvent e) { JComboBox comboBox = (JComboBox)e.getSource(); Item item = (Item)comboBox.getSelectedItem(); System.out.println( item.getId() + " : " + item.getDescription() ); } class ItemRenderer extends BasicComboBoxRenderer { public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value != null) { Item item = (Item)value; setText( item.getDescription().toUpperCase() ); } if (index == -1) { Item item = (Item)value; setText( "" + item.getId() ); } return this; } } class Item { private int id; private String description; public Item(int id, String description) { this.id = id; this.description = description; } public int getId() { return id; } public String getDescription() { return description; } public String toString() { return description; } } public static void main(String[] args) { JFrame frame = new ComboBoxItem(); frame.setDefaultCloseOperation( EXIT_ON_CLOSE ); frame.pack(); frame.setVisible( true ); } } 

如果你有一个hashmap,你会想做类似的事情:

 JComboBox box = new JComboBox(hashMap.getValues().toArray()); 

当然,您必须覆盖HashMap对象的toString方法

如果要覆盖toString()方法,您可以创建一个实现Map的装饰器类,并使用HashMap实现所需的方法并提供自己的toString()