2012-03-10 93 views
4

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

<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> 
+0

答案是使用CombBoxModel,那里你可以一切开始实施矢量结束与Xml结构 – mKorbel 2012-03-10 22:33:58

回答

6

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


下面是一个例子来说明我的建议。然而,当你得到这个基本思想的工作时,遵循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; 
     } 
    } 
} 
+0

-1为建议覆盖toString出于查看原因。正确的事情是自定义渲染器。 – kleopatra 2012-03-11 11:39:57

+0

如果我这样做:'combo.addItem(customer.get(i).toString());',我收到一个列表,其中包含诸如“Customer @ 749395a”,“Customer @ 2864932e”等条目。 – 2012-03-11 15:53:51

+1

@Evgeni Reznik您需要先在客户类中编写方法toString()。你有班级客户吗?您的自定义toString()将返回要显示在组合框中的客户的正确名称。然后,您可以将整个客户对象添加到组合框中。 – 2012-03-11 16:00:22

3

假设你有一个类人持有的名称和ID,你可以添加此类的实例作为组合框的对象。 getSelectedItem()将返回所选Person的实例。

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

+0

+1为渲染器,-1为重写toString(总共零:-) – kleopatra 2012-03-11 11:41:13