组合框(JComboBox)是一个下拉列表,其特点是将多个选项折叠在一起,只显示最前面或被选中的一项。组合框有两种形式:不可编辑和可编辑,对于不可编辑的组合框,用户只能在现有的选项中进行选择;对于可编辑的组合框,用户既可以在现有选项中选择,也可以输入要选择的选项,甚至可以输入列表中没有的内容。组合框是由JcomboBox类来实现的,可以通过JComboBox类的setEditable(boolean b)方法来设置组合框是否可编辑。 JComboBox类是一个泛型类,其构造方法如下:
- JComboBox():创建一个没有任何选项的组合框。
- JComboBox(E[] items):创建一个组合框,其选项来自于指定的数组,E是泛型的类型参数名称。
- JComboBox(ComboBoxModel<E> aModel):创建一个组合框,其选项来自于ComboBoxModel。
例如,下面的代码创建一个包含4个可选项的组合框。
String items[]= {"北京","黑龙江","吉林","辽宁"};
JComboBox jcb=new JComboBox(items);
JComboBox类中定义了添加、删除和获取选项的相关方法,常用方法如下:
- void addItem(E item):在下拉列表末尾添加新的选项。
- void insertItemAt(E item,int index):在index指定的位置添加新的选项。
- void removeItem(Object anObject):删除指定的选项。
- void removeItemAt(int anIndex):删除指定位置的可选项。
- void removeAllItems():删除所有可选项。
- Object getSelectedItem():返回当前选中项。
- int getSelectedIndex():返回当前选中项的索引。
- int getItemCount():返回列表中的项数。
- void setSelectedItem(Object anObject): 设置当前选中项。
- void setSelectedIndex(int anIndex):设置当前选中项的索引。
例如,通过下面的代码可以动态地向组合框中增加新的选项。
jcb.addItem("山东"); //在下拉列表的末尾增加新的选项
jcb.insertItemAt("上海", 1); //在下拉列表的第1个位置增加新的选项
上面的代码是向组合框中增加String对象,下拉列表中显示的是字符串。如果向下拉列表中增加其它类型的对象,那么在该下拉列表中显示的是对象的toString()方法返回的内容。toString()方法是Object类中定义的方法,其返回值是对象的class名称+@+hashCode的十六进制字符串。如果想要在下拉列表中显示指定的内容,则需重写toString()方法。
【例1】利用数组创建组合框。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JComboBoxDemo1 {
public static void main(String[] args) {
Province provinces[]= {new Province(11,"北京"),
new Province(23,"黑龙江"),
new Province(22,"吉林"),
new Province(21,"辽宁")};
JFrame frame=new JFrame("组合框示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null); //窗口居中显示
frame.setSize(300,200);
JPanel panel=new JPanel();
JTextField textField=new JTextField();
JComboBox comboBox=new JComboBox(provinces);//创建组合框 ①
panel.add(comboBox);
frame.add(panel,BorderLayout.CENTER);
frame.add(textField,BorderLayout.NORTH);
//在下拉列表的末尾增加新的选项
comboBox.addItem(new Province(37,"山东"));
//在下拉列表的第1个位置增加新的选项
comboBox.insertItemAt(new Province(31,"上海"), 1);
//注册事件监听器(匿名类)
comboBox.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
JComboBox jcb=(JComboBox)e.getSource();//获取事件源
//返回当前选中项
Province province=(Province)jcb.getSelectedItem(); ②
//在文本框中显示选中项
textField.setText(province.code+"-"+province.name);
}
});
comboBox.setSelectedIndex(2);//设置当前选中项为第2项
frame.setVisible(true);
}
}
class Province{
int code;
String name;
public Province(int code,String name){
this.code=code;
this.name=name;
}
//重写方法
public String toString() {
return name;
}
}
运行上述程序,由于设置初始选中项为第2项,因此显示结果如图1(a)所示。单击下拉列表,显示结果如图1(b)所示。可以在下拉列表中的重新选择选中项,每次修改选选中项都会触发ActionEvent事件,并在文本框中显示当前被选中项的信息。
![]() | ![]() |
由于JComboBox是一个泛型类,因此,在创建组合框时可以通过类型参数指定下拉列表中存储的对象类型。例如,在例1中,可以采用如下方式创建组合框对象。
JComboBox<Province> comboBox=new JComboBox<Province>(provinces);
组合框可以使用ComboBoxModel来管理其数据模型,ComboBoxModel是一个泛型接口,它定义了操作组合框的基本操作。在实际应用中,一般采用DefaultComboBoxModel类的对象来管理组合框的数据模型,DefaultComboBoxModel是泛型接口MutableComboBoxModel的实现类,而MutableComboBoxModel是ComboBoxModel的子接口。DefaultComboBoxModel是一个泛型类,其主要方法如下:
- void addElement(E item):向组合框数据模型末尾添加一个元素。
- void insertElement(E item,int index):向组合框数据模型的指定位置添加一个元素。
- Object getElementAt(int index):获取组合框数据模型中指定位置的元素。
- void removeElement(Object obj):删除组合框数据模型中指定的元素。
- void removeAllElements():删除组合框数据模型中的所有元素。
- int getSize():获取组合框数据模型中元素的数量。
- void setSelectedItem(Object anObject):设置组合框数据模型中被选中的元素。
- Object getSelectedItem():返回组合框数据模型中被选中的元素。
下面是利用数据模型创建组合框的程序,其运行结果与例1是一致的。
【例2】利用数据模型创建组合框。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JComboBoxDemo2 {
public static void main(String[] args) {
JFrame frame=new JFrame("组合框示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setSize(300,200);
JPanel panel=new JPanel();
JTextField textField=new JTextField();
//创建组合框的数据模型
DefaultComboBoxModel<Province> model=new
DefaultComboBoxModel<Province>();
model.addElement(new Province(11,"北京"));
model.addElement(new Province(31,"上海"));
model.addElement(new Province(23,"黑龙江"));
model.addElement(new Province(22,"吉林"));
model.addElement(new Province(21,"辽宁"));
model.addElement(new Province(37,"山东"));
JComboBox comboBox=new JComboBox(model);//创建组合框
panel.add(comboBox);
frame.add(panel,BorderLayout.CENTER);
frame.add(textField,BorderLayout.NORTH);
//注册事件监听器(匿名类)
comboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//返回数据模型中被选中的元素
Province province=(Province)model.getSelectedItem();
//在文本框中显示选中项
textField.setText(province.code+"-"+province.name);
}
});
//设置当前选中项为数据模型中的第2项
model.setSelectedItem(model.getElementAt(2));
frame.setVisible(true);
}
}