是否可以定义与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>
答案 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}}。