2010-08-10 85 views
3

我有一个表有两列 - iddesc。是否有可能在JComboBox中向用户显示desc列值的列表,并且当用户从列表中选择一个项目并单击某个按钮时,我会得到相应的id值?JComboBox提交价值喜欢HTML选择

也就是说,在Swing中可以这样做吗?

<select> 
<option value="1">Hi</option> 
<option value="2">Hello</option> 
</select> 

当用户点击Hello时,我需要2作为值。

回答

4

以下是使用JComboBox的示例。这个概念是一个JList相同:

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

} 

或者你总是可以使用一个JTable来存储数据,只是删除第一个TableColumn的来回的TableColumnModel所以它不是在表中可见。

+0

哇...在SO camickr!刚注意到.. !! – 2010-08-10 06:57:28

2

您可以将任何对象传递给您的JList。

例如为:

public class myListItem { 
    private String text; 
    private int id; 

public String toString() { 
    return text; 
} 
...getters/setters and constructor.... 

//Add to list: 
JList myList = new JList(); 
myList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
DefaultListModel listModel = new DefaultListModel(); 
listModel.addElement(new MyListItem("one", 1); 
listModel.addElement(new MyListItem("two", 2); 
lst_scans.setModel(listModel); 
lst_scans.setSelectedIndex(0); 

//Obtain selection: 
MyListItem item = (MyListItem) myList.getSelectedValue();