Java JComboBox的值
是否可以定义与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> 但在这里我只会得到“猫”
在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;
}
}
}