2010-05-11 37 views
8

我正在使用集合的所有元素填充JComboBox(使用addItem())。集合中的每個元素都是一個HashMap(所以它是一個哈希表組合框..)。如何使用地圖元素作爲JComboBox的文本

我的問題是 - 鑑於我需要每個項目是HashMap如何將文本設置爲GUI中組合框中的apear?它需要是地圖中某個鍵的值。通常,如果我使用自己的類型填充組合框,那麼我會忽略toString()方法...但是我不確定如何實現這一功能,因爲我正在使用Java HashMap。

任何想法(如果可能,沒有實現我自己的HashMap)?

更新:好像有沒有辦法避免讓對象int JComboBox overide toString()如果我想自定義功能..我希望有一種方法(1)指定的對象是加載到JComboBox中並(2)指定這些對象在GUI中的顯示方式。

回答

9

有對象的toString方法( 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); 
    } 

} 
+0

完美解決方案。! – 2012-04-29 21:38:53

0

如果你想覆蓋toString()方法你可以只創建一個實現Map和使用HashMap來實現所需的方法裝飾類,並給自己實現toString()

+0

是的,我真的很希望避免這種情況,如果您的建議 – llm 2010-05-11 17:17:25

0

如果你有一個HashMap,你會想要做的事,如:

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

當然,你必須覆蓋您在HashMap

+0

possible..but感謝除非我誤解了OP,這不是這種情況。他有新的JComboBox(someCollection );而不是僅僅需要單個HashMap的值。 – 2010-05-11 17:48:50

相關問題