Java开发笔记(一百三十一)Swing的列表框
前面介绍了选择框的用法,当时为了方便用户勾勾点点,无论是复选框还是单选按钮,统统把所有选项都摆在界面上。倘若只有两三个选项还好办,要是选项数量变多比如超过五个,这么多的选择框一齐在界面罗列,不光程序员排版费劲,用户瞅着也容易眼花。鉴于这些选择框往往选完一次就了事,难得有重新选择第二次的机会,因而在界面上全部铺开这些选择框实属浪费。更好的做法是在选择的时候才展开所有选项,选完之后就缩回只显示选中的那一项,一伸一缩之间才能充分利用有限的屏幕界面。
以单选按钮的组合为例,许多个单选按钮只能选择其中一个,这种情况就很适合展开与收缩的处理逻辑。swing给该场景提供了专门的下拉框控件jcombobox,为了往下拉框塞进各个选项,还需要将它与下拉框模型defaultcomboboxmodel搭配使用才行。下拉框具体的调用过程分为下列三个步骤:
1、创建一个下拉框模型,并调用模型对象的addelement方法依次添加每个选项;
2、创建一个下拉框控件,注意要在jcombobox的构造方法中填入第一步的模型对象;
3、调用下拉框对象的additemlistener方法给它添加一个点击监听器,每当用户在下拉面板中选择某一项,都会触发监听器的itemstatechanged方法。此时即可通过下拉框对象的getselectedindex方法获得选中项的序号,还可通过getselecteditem方法获得选中项的对象。
下面是利用jcombobox实现下拉选择功能的代码例子:
jpanel paneltop = new jpanel(); // 创建顶部面板
// 创建一个下拉框模型
defaultcomboboxmodel<string> combomodel = new defaultcomboboxmodel<string>();
combomodel.addelement("鱼香肉丝饭"); // 往下拉模型中添加元素
combomodel.addelement("香菇滑鸡饭"); // 往下拉模型中添加元素
combomodel.addelement("黑椒牛排饭"); // 往下拉模型中添加元素
combomodel.addelement("梅菜扣肉饭"); // 往下拉模型中添加元素
combomodel.addelement("糖醋里脊饭"); // 往下拉模型中添加元素
combomodel.addelement("红烧排骨饭"); // 往下拉模型中添加元素
combomodel.addelement("台式卤肉饭"); // 往下拉模型中添加元素
jcombobox<string> combobox = new jcombobox<string>(combomodel); // 创建一个下拉框
paneltop.add(combobox); // 在顶部面板上添加下拉框
frame.add(paneltop, borderlayout.north); // 把顶部面板添加到窗口的北边(上方)
combobox.seteditable(false); // 设置下拉框能否编辑。默认不允许编辑
combobox.additemlistener(new itemlistener() { // 给下拉框添加一个点击监听器
public void itemstatechanged(itemevent e) { // 下拉框被选择
// 获取下拉框内选中项的序号及其描述
// getselectedindex方法可获得选中项的序号,getselecteditem方法可获得选中项的对象
string desc = string.format("您点了第%d项,套餐名称是%s",
combobox.getselectedindex(), combobox.getselecteditem().tostring());
label.settext(desc); // 在标签上显示当前选中的文本项
}
});
运行上面的下拉框代码,弹出如下图所示的窗口界面,可见一开始下拉框只占据长条般的空间,并且默认展示第一个选项。
接着单击下拉框的长条区域,界面会向下弹出包含所有选项的下拉面板,选中面板上的某一项后,下拉面板消失不见,同时长条框内的文字变成了刚才选中项的文本。选择前后的窗口界面分别如以下两张图所示。
虽然下拉框比起单选按钮组合要节省屏幕空间,但它的实现机制也导致了如下几点局限:
1、下拉框只实现了单选功能,不支持多选功能,无法同时选择好几个选项;
2、重新选择之时,要先点一下长条区域,才能在弹出的下拉面板中挑选新的选项,简简单单的选择操作也花费了两个步骤,甚不经济;
以上两点局限的起因,皆来源于下拉面板的弹出与缩回机制,每次都要单击长条框才会弹出下拉面板,单击选中某一项后又会自动关闭下拉面板,正是这种单次点击单次响应的行为决定了下拉框只能用于单选操作,而不能用于多选操作。要想实现多选功能,还得将所有选项铺开展示,就像文件列表那样,用户才能按下ctrl键逐个选中,或者按下shift键选择一段连续的数个选项。这种平铺直叙所有选项的控件也叫列表框,对应于swing中的jlist类型,列表框的用法类似下拉框,它的调用过程依然分为以下三个步骤:
1、创建一个列表框模型defaultlistmodel,并调用模型对象的addelement方法依次添加每个选项;
2、创建一个列表框控件,注意要在jlist的构造方法中填入第一步的模型对象;
3、调用列表框对象的addlistselectionlistener方法给它添加一个点击监听器,每当用户单击列表框中的某一项,都会触发监听器的valuechanged方法。此时即可通过列表框对象的getselectedindex方法获得选中项的序号,通过getselectedvalue方法获得选中项的值,还能通过getselectedvalueslist方法获得所有选中项的值列表。
下面是利用jlist实现多次选择功能的代码例子:
jpanel panelleft = new jpanel(); // 创建左边面板
// 创建一个列表框模型
defaultlistmodel<string> listmodel = new defaultlistmodel<string>();
listmodel.addelement("鱼香肉丝饭"); // 往列表模型中添加元素
listmodel.addelement("香菇滑鸡饭"); // 往列表模型中添加元素
listmodel.addelement("黑椒牛排饭"); // 往列表模型中添加元素
listmodel.addelement("梅菜扣肉饭"); // 往列表模型中添加元素
listmodel.addelement("糖醋里脊饭"); // 往列表模型中添加元素
listmodel.addelement("红烧排骨饭"); // 往列表模型中添加元素
listmodel.addelement("台式卤肉饭"); // 往列表模型中添加元素
jlist<string> listbox = new jlist<string>(listmodel); // 创建一个列表框
panelleft.add(listbox); // 在顶部面板上添加列表框
frame.add(panelleft, borderlayout.west); // 把顶部面板添加到窗口的西边(左侧)
listbox.addlistselectionlistener(new listselectionlistener() { // 给列表框添加一个点击监听器
public void valuechanged(listselectionevent arg0) { // 列表框被选择
// 获取列表框内选中项的序号及其描述
// getselectedindex方法可获得选中项的序号,getselectedvalue方法可获得选中项的值
string desc = string.format("您点了第%d项,套餐名称是%s",
listbox.getselectedindex(), listbox.getselectedvalue());
labelbottom.settext(desc); // 在标签上显示当前选中的文本项
string total = "<html>您已选择的套餐列表如下:<br>";
// 获取列表框内的所有选择项,并拼接html格式的描述串
for (string str : listbox.getselectedvalueslist()) {
total = string.format("%s<center>%s</center>", total, str);
}
total += "</html>";
labelcenter.settext(total); // 在标签上显示所有选中的文本项
}
});
运行以上的列表框代码,弹出如下图所示的窗口界面,可见列表框一开始就展示了所有选项。
然后按住ctrl键,从下往上依次单击选中第七项、第五项、第三项、第一项,每次单击之后的界面效果分别如以下四张图片所示。
从这些效果图可以看到,在按住ctrl键的时候,列表框可以实现多选功能;未按住ctrl键的时候,列表框变成实现单选功能。
更多java技术文章参见《java开发笔记(序)章节目录》