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",
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",
labelBottom.setText(desc); // 在标签上显⽰当前选中的⽂本项
String total = "<html>您已选择的套餐列表如下:<br>";
// 获取列表框内的所有选择项,并拼接html格式的描述串
for (String str : SelectedValuesList()) {
total = String.format("%s<center>%s</center>", total, str);
}
total += "</html>";
labelCenter.setText(total); // 在标签上显⽰所有选中的⽂本项
}
});
运⾏以上的列表框代码,弹出如下图所⽰的窗⼝界⾯,可见列表框⼀开始就展⽰了所有选项。
javaswing实现购买然后按住Ctrl键,从下往上依次单击选中第七项、第五项、第三项、第⼀项,每次单击之后的界⾯效果分别如以下四张图⽚所⽰。
更多Java技术⽂章参见《》