JComboBox的值

时间:2012-03-10 21:01:47

标签: java swing jcombobox

是否可以定义与JComboBox中的实际内容不同的值?
在HTML中,它看起来如下:

<select>
  <option value="value1">Content1</option>
  <option value="value2">Content2</option>
  <option value="value3">Content3</option>
</select>

无论内容多长,都可以得到一个简短的值。

在Java中我只知道以下解决方案:

// Creating new JComboBox with predefined values
   String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" }; 
   private JComboBox combo = new JComboBox(petStrings);

// Retrieving selected value
   System.out.println(combo.getSelectedItem());

但在这里我只会得到“猫”,“狗”等。

问题是,我想将数据库中的所有客户名称加载到JComboBox中,然后从所选客户中检索ID。它应该是这样的:

<select>
  <option value="104">Peter Smith</option>
  <option value="121">Jake Moore</option>
  <option value="143">Adam Leonard</option>
</select>

3 个答案:

答案 0 :(得分:6)

如果您创建一个Customer类并将一个Customer对象列表加载到组合框中,那么您将获得所需的内容。组合框将显示对象的toString(),因此Customer类应在toString()中返回名称。当您检索所选项目时,它是一个Customer对象,您可以从中获取ID或其他任何内容。


这是一个例子来说明我的建议。但是,当你掌握这个基本想法时,遵循kleopatra和mKorbel的建议是个好主意。

import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class ComboJumbo extends JFrame{

    JLabel label;
    JComboBox combo;

    public static void main(String args[]){
        new ComboJumbo();
    }

    public ComboJumbo(){
        super("Combo Jumbo");
        label = new JLabel("Select a Customer");
        add(label, BorderLayout.NORTH);

        Customer customers[] = new Customer[6];
        customers[0] = new Customer("Frank", 1);
        customers[1] = new Customer("Sue", 6);
        customers[2] = new Customer("Joe", 2);
        customers[3] = new Customer("Fenton", 3);
        customers[4] = new Customer("Bess", 4);
        customers[5] = new Customer("Nancy", 5);

        combo = new JComboBox(customers);
        combo.addItemListener(new ItemListener(){

            public void itemStateChanged(ItemEvent e) {
                Customer c = (Customer)e.getItem();
                label.setText("You selected customer id: " + c.getId());
            }

        });
        JPanel panel = new JPanel();
        panel.add(combo);
        add(panel,BorderLayout.CENTER);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 200);
        setVisible(true);
    }


    class Customer{
        private String name;
        private int id;

        public Customer(String name, int id){
            this.name = name;
            this.id = id;
        }

        public String toString(){
            return getName();
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }
    }
 }

答案 1 :(得分:3)

假设您有一个包含名称和ID的Person类,您可以将此类的实例添加为组合框的对象。然后getSelectedItem()将返回所选Person的实例。

问题是在组合框中正确显示人物。您可以在类中重载toString以返回名称,或者您可以将自己的ListCellRenderer提供给组合框并在组合框中呈现您想要的任何内容(例如,照片缩略图)。

答案 2 :(得分:0)

我刚刚在https://stackoverflow.com/a/10734784/11961回答了另一个问题,该问题解释了创建自定义ListCellRenderer的好方法,该自定义toString()用替代标签替换了值类的{{1}}。