[英]How to use Map element as text of a JComboBox
I am populating a JComboBox (using addItem()
) with all the elements of a collection. 我正在使用集合的所有元素填充JComboBox(使用
addItem()
)。 Each element in the collection is a HashMap
(so its a ComboBox of Hashmaps..). 集合中的每个元素都是
HashMap
(因此它是Hashmaps的ComboBox ..)。
My question is - Given that I need each item to be a HashMap
how do I set the text to apear in the combobox on the GUI? 我的问题是 - 鉴于我需要每个项目都是
HashMap
如何在GUI上的组合框中将文本设置为apear? It needs to be the value of a certain key in the map. 它必须是地图中某个键的值。 Normally if I am populating a combobox with my own type, I would just overide the
toString()
method...but I am not sure how to acheive this since I am using a Java HashMap. 通常,如果我使用自己的类型填充组合框,我只会覆盖
toString()
方法...但我不知道如何实现这一点,因为我使用的是Java HashMap。
Any ideas (if possible, without implementing my own HashMap)? 任何想法(如果可能的话,没有实现我自己的HashMap)?
Update : It seems like there isn't anyway to avoid having the object int the JComboBox overide toString() if I want custom functionality..I wish there was a way to (1) specify the objects to be loaded into the JComboBox and (2) specify how these objects are to appear in the GUI. 更新 :似乎没有办法避免让对象在JComboBox上面覆盖toString()如果我想要自定义功能..我希望有一种方法可以(1)指定要加载到JComboBox中的对象和( 2)指定这些对象在GUI中的显示方式。
(2) specify how these objects are to appear in the GUI.
(2)指定这些对象在GUI中的显示方式。
You can add any Object to the model and then create a custom renderer to display the object any way you want. 您可以将任何对象添加到模型中,然后创建自定义渲染器以任何方式显示对象。 Simple example that shows the toString() approach and custom renderer approach:
显示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 );
}
}
如果要覆盖toString()
方法,您可以创建一个实现Map
的装饰器类,并使用HashMap
实现所需的方法并提供自己的toString()
。
If you have a hashmap, you will want to do something like: 如果你有一个hashmap,你会想做类似的事情:
JComboBox box = new JComboBox(hashMap.getValues().toArray());
Of course, you have to override the toString
method of the object you have in the HashMap
当然,您必须覆盖
HashMap
对象的toString
方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.