2010-05-11 9 views
8

Je remplis un JComboBox (en utilisant addItem()) avec tous les éléments d'une collection. Chaque élément de la collection est un HashMap (c'est donc un ComboBox de Hashmaps ..).Comment utiliser l'élément Map comme texte d'un JComboBox

Ma question est - Étant donné que j'ai besoin que chaque élément soit un HashMap comment puis-je définir le texte à apparaître dans la liste déroulante sur l'interface graphique? Il doit être la valeur d'une certaine clé dans la carte. Normalement, si je remplis une combobox avec mon propre type, je surpasserais la méthode toString() ... mais je ne suis pas sûr de savoir comment y parvenir puisque j'utilise une Java HashMap.

Des idées (si possible, sans implémenter ma propre HashMap)?

Mise à jour: Il semble qu'il n'y ait pas de toute façon d'éviter d'avoir l'objet int JComboBox overide toString() si je veux la coutume functionality..I souhaite qu'il y ait un moyen de (1) spécifier les objets à chargé dans le JComboBox et (2) spécifier comment ces objets doivent apparaître dans l'interface graphique.

Répondre

9

(2) spécifiez comment ces objets sont apparaissent dans l'interface graphique.

Vous pouvez ajouter un objet au modèle, puis créer un rendu personnalisé pour afficher l'objet comme vous le souhaitez. Exemple simple qui montre la toString() approche et approche personnalisée renderer:

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); 
    } 

} 
+0

Solution parfaite.! –

0

Si vous souhaitez remplacer la méthode toString() vous pouvez simplement créer une classe de décorateur qui implémente Map et utilise un HashMap pour les méthodes mises en œuvre nécessaires et de donner votre propre implémentation de toString().

+0

oui, j'espérais vraiment éviter cela si possible..but merci pour la suggestion – llm

0

Si vous avez un hashmap, vous voulez faire quelque chose comme:

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

Bien sûr, vous devez remplacer la méthode toString de l'objet que vous avez dans le HashMap

+0

À moins d'avoir mal compris l'OP ce n'est pas la situation. Il a une nouvelle JComboBox (someCollection ); plutôt que de simplement vouloir les valeurs d'un seul HashMap. –