Я заполняю JComboBox (использование addItem()
) со всеми элементами набора. Каждый элемент в наборе является a HashMap
(таким образом, это - ComboBox Hashmaps..).
Мой вопрос - Учитывая, что мне нужен каждый объект, чтобы быть a HashMap
как я устанавливаю текст для появлений в поле комбинированного списка на GUI? Это должно быть значение определенного ключа в карте. Обычно, если я заполняю поле комбинированного списка со своим собственным типом, я был бы просто сверхъязь toString()
метод..., но я не уверен, как достигнуть этого, так как я использую Java HashMap.
Какие-либо идеи (если это возможно, не реализовывая мой собственный HashMap)?
Обновление: Это походит, там не должен так или иначе стараться не иметь объектный интервал сверхъязь JComboBox toString (), если я хочу пользовательскую функциональность.. Мне жаль, что не было способа (1) указать объекты, которые будут загружены в JComboBox и (2) указать, как эти объекты состоят в том, чтобы появиться в GUI.
(2) укажите, как эти объекты должны быть отображаются в графическом интерфейсе.
Можно добавить в модель любой объект Object, а затем создать пользовательский рисудер для отображения объекта любым нужным способом. Простой пример, в которого показан подход 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 );
}
}
Если у вас есть хэш-карта, вы захотите сделать что-то вроде:
JComboBox box = new JComboBox(hashMap.getValues().toArray());
Конечно, вы должны переопределить метод toString
объекта, который у вас есть в HashMap
Если вы хотите переопределить метод toString ()
, вы можно просто создать класс декоратора, который реализует Map
и использует HashMap
для реализации необходимых методов и дает вашу собственную реализацию toString ()
.