Java JComboBox的值

Java JComboBox的值,java,swing,jcombobox,Java,Swing,Jcombobox,是否可以定义与JComboBox中实际内容不同的值? 在HTML中,它如下所示: <select> <option value="value1">Content1</option> <option value="value2">Content2</option> <option value="value3">Content3</option> </select> 但在这里我只会得到“猫”

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

<select>
  <option value="value1">Content1</option>
  <option value="value2">Content2</option>
  <option value="value3">Content3</option>
</select>
但在这里我只会得到“猫”、“狗”等 问题是,我想将数据库中所有客户的名称加载到JComboBox中,然后从所选客户检索ID。应该是这样的:

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

彼得·史密斯
杰克·摩尔
亚当·莱昂纳德

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


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

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


这里有一个例子来说明我的建议。然而,当这个基本想法开始运作时,遵循克利奥帕特拉和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;
        }
    }
 }

我刚才回答了另一个问题,解释了一种创建自定义
ListCellRenderer
的好方法,该方法使用可选标签替换值类上的
toString()

答案是使用ComboxModel,在这里,您可以从实现的Vector开始,以Xml结构结束,1建议出于视图原因重写toString。正确的做法是定制渲染器,我收到一个充满条目的列表,如
Customer@749395a
Customer@2864932e
等@Evgeni Reznik您需要首先在customer类中编写方法toString()。你有班级客户吗?自定义toString()将返回要在组合框中显示的客户的正确名称。然后可以将整个customer对象添加到组合框中。完成此操作并实现基本想法后,您应该注意@kleopatra和mKorbel+1对渲染器的注释,-1对重写toString的注释(总共为零:-)
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;
        }
    }
 }