2010-05-11 29 views
8

Tôi đang điền một JComboBox (sử dụng addItem()) với tất cả các phần tử của bộ sưu tập. Mỗi phần tử trong bộ sưu tập là HashMap (do đó, một ComboBox của Hashmaps ..).Cách sử dụng phần tử Bản đồ làm văn bản của JComboBox

Câu hỏi của tôi là - Do tôi cần mỗi mục là HashMap làm cách nào để đặt văn bản thành lời nhắc trong hộp tổ hợp trên GUI? Nó cần phải là giá trị của một khóa nhất định trong bản đồ. Bình thường, nếu tôi đang điền một combobox với kiểu của riêng tôi, tôi sẽ chỉ cần vượt qua phương thức toString() ... nhưng tôi không chắc chắn làm thế nào để đạt được điều này kể từ khi tôi đang sử dụng một HashMap Java.

Bất kỳ ý tưởng nào (nếu có thể, mà không triển khai HashMap của riêng tôi)?

Cập nhật: Dường như không có cách nào để tránh có đối tượng int JComboBox vượt qua toString() nếu tôi muốn chức năng tùy chỉnh..Tôi muốn có cách để (1) xác định các đối tượng cần nạp vào JComboBox và (2) chỉ định cách các đối tượng này xuất hiện trong GUI.

Trả lời

9

(2) chỉ định cách các đối tượng này là xuất hiện trong GUI.

Bạn có thể thêm bất kỳ đối tượng nào vào mô hình và sau đó tạo trình kết xuất tùy chỉnh để hiển thị đối tượng theo bất kỳ cách nào bạn muốn. ví dụ đơn giản cho thấy toString() phương pháp tiếp cận và tùy chỉnh 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

Giải pháp hoàn hảo.! –

0

Nếu bạn muốn ghi đè toString() phương pháp bạn chỉ có thể tạo ra một lớp trang trí mà thực hiện Map và sử dụng một HashMap để thực hiện các phương pháp cần thiết và đưa ra thực hiện của riêng bạn toString().

+0

vâng, tôi đã thực sự hy vọng có thể tránh điều này nếu nhờ possible..but cho đề nghị – llm

0

Nếu bạn có một hashmap, bạn sẽ muốn làm điều gì đó như:

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

Tất nhiên, bạn phải ghi đè lên các phương pháp toString của đối tượng bạn có trong HashMap

+0

Trừ khi tôi hiểu lầm OP đây không phải là tình hình. Anh ấy có JComboBox mới (someCollection ); thay vì chỉ muốn các giá trị của một HashMap duy nhất. –

Các vấn đề liên quan