前面介绍了选择框的用法,当时为了方便用户勾勾点点,无论是复选框还是单选按钮,统统把所有选项都摆在界面上。倘若只有两三个选项还好办,要是选项数量变多比如超过五个,这么多的选择框一齐在界面罗列,不光程序员排版费劲,用户瞅着也容易眼花。鉴于这些选择框往往选完一次就了事,难得有重新选择第二次的机会,因而在界面上全部铺开这些选择框实属浪费。更好的做法是在选择的时候才展开所有选项,选完之后就缩回只显示选中的那一项,一伸一缩之间才能充分利用有限的屏幕界面。

以单选按钮的组合为例,许多个单选按钮只能选择其中一个,这种情况就很适合展开与收缩的处理逻辑。Swing给该场景提供了专门的下拉框控件JComboBox,为了往下拉框塞进各个选项,还需要将它与下拉框模型DefaultComboBoxModel搭配使用才行。下拉框具体的调用过程分为下列三个步骤:

1、创建一个下拉框模型,并调用模型对象的addElement方法依次添加每个选项;

2、创建一个下拉框控件,注意要在JComboBox的构造方法中填入第一步的模型对象;

3、调用下拉框对象的addItemListener方法给它添加一个点击监听器,每当用户在下拉面板中选择某一项,都会触发监听器的itemStateChanged方法。此时即可通过下拉框对象的getSelectedIndex方法获得选中项的序号,还可通过getSelectedItem方法获得选中项的对象。

下面是利用JComboBox实现下拉选择功能的代码例子:

JPanel panelTop = new JPanel(); // 创建顶部面板

// 创建一个下拉框模型

DefaultComboBoxModel comboModel = new DefaultComboBoxModel();

comboModel.addElement("鱼香肉丝饭"); // 往下拉模型中添加元素

comboModel.addElement("香菇滑鸡饭"); // 往下拉模型中添加元素

comboModel.addElement("黑椒牛排饭"); // 往下拉模型中添加元素

comboModel.addElement("梅菜扣肉饭"); // 往下拉模型中添加元素

comboModel.addElement("糖醋里脊饭"); // 往下拉模型中添加元素

comboModel.addElement("红烧排骨饭"); // 往下拉模型中添加元素

comboModel.addElement("台式卤肉饭"); // 往下拉模型中添加元素

JComboBox comboBox = new JComboBox(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 listModel = new DefaultListModel();

listModel.addElement("鱼香肉丝饭"); // 往列表模型中添加元素

listModel.addElement("香菇滑鸡饭"); // 往列表模型中添加元素

listModel.addElement("黑椒牛排饭"); // 往列表模型中添加元素

listModel.addElement("梅菜扣肉饭"); // 往列表模型中添加元素

listModel.addElement("糖醋里脊饭"); // 往列表模型中添加元素

listModel.addElement("红烧排骨饭"); // 往列表模型中添加元素

listModel.addElement("台式卤肉饭"); // 往列表模型中添加元素

JList listBox = new JList(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格式的描述串

for (String str : listBox.getSelectedValuesList()) {

total = String.format("%s

%s", total, str);

}

total += "";

labelCenter.setText(total); // 在标签上显示所有选中的文本项

}

});

运行以上的列表框代码,弹出如下图所示的窗口界面,可见列表框一开始就展示了所有选项。

然后按住Ctrl键,从下往上依次单击选中第七项、第五项、第三项、第一项,每次单击之后的界面效果分别如以下四张图片所示。

从这些效果图可以看到,在按住Ctrl键的时候,列表框可以实现多选功能;未按住Ctrl键的时候,列表框变成实现单选功能。

java swing 列表框_Java开发笔记(一百三十一)Swing的列表框相关推荐

  1. java正则表达式分割字符串_Java开发笔记(三十七)利用正则串分割字符串

    前面介绍了处理字符串的常用方法,还有一种分割字符串的场景也很常见,也就是按照某个规则将字符串切割为若干子串.分割规则通常是指定某个分隔符,根据字符串内部的分隔符将字符串进行分割,例如逗号.空格等等都可 ...

  2. java 正则切分句子_Java开发笔记(三十七)利用正则串分割字符串

    前面介绍了处理字符串的常用方法,还有一种分割字符串的场景也很常见,也就是按照某个规则将字符串切割为若干子串.分割规则通常是指定某个分隔符,根据字符串内部的分隔符将字符串进行分割,例如逗号.空格等等都可 ...

  3. Android开发笔记(三十八)列表类视图

    AdapterView AdapterView顾名思义是适配器视图,Spinner.ListView和GridView都间接继承自AdapterView,这三个视图都存在多个元素并排展示的情况,所以需 ...

  4. Android开发笔记(三十一)SQLite游标及其数据结构

    ContentValues ContentValues类似于映射,也是用于存储键值对.区别之处在于ContentValues的键只能是字符串,查看ContentValues的源码,会发现其内部保存键值 ...

  5. java awt 显示图片_Java开发笔记(一百二十三)AWT图像视图

    前面介绍了AWT的几种基础控件,从按钮到文本标签,从输入框到选择框,无一例外都能显示文字,唯独无法显示某张图片文件.本以为AWT会提供专门的控件来显示图片,然而偏偏没有意料之中的图像控件,这可真是弱爆 ...

  6. JAVA翻译官_Java开发笔记(三)Java帝国的特种官吏

    上一篇文章介绍了Java工程的帝国区划,末尾给出了一段Java代码例子,这个代码虽然勉强能看懂,但是有些细节令人不甚了了.比如说"// 参观朱雀台"为何能够直接跟在当前行后面?&q ...

  7. java有常函数_Java开发笔记(十一)常见的数学函数

    前面介绍了Java编程的四则运算,虽然提供了基础的加减乘除符号,但是数学上还有其它运算符号,包括四舍五入用到的约等号≈.求绝对值的"| |".开平方的"√ ̄", ...

  8. java多态的应用场景_Java开发笔记(五十一)多态的发生场景

    江湖上传闻,面向对象之所以厉害,是因为它拥有封装.继承与多态三项神技,只要三板斧一出,号令天下谁敢不从.前面费了老大的劲才讲清楚封装和继承,那么多态又是怎样的神乎其神呢?下面先通过一个简单的例子来说明 ...

  9. java二维数组的扩容_Java开发笔记(二十一)二维数组的扩展

    前面介绍的数组容纳的是一串数字,仿佛一根线把这组数字串了起来,故而它只是一维数组.一维数组用来表示简单的数列尚可,要是表达复杂的平面坐标系,那就力不从心了.由于平面坐标系存在水平和垂直两个方向,因此可 ...

最新文章

  1. 随笔-使用时间管理有感
  2. 成功解决cv2.imwrite(filename, img)代码输出中文文件乱码的问题(cv2.imencode方法解决)
  3. junit测试NoSuchBeanDefinitionException: No bean named ‘dataSource‘ is define
  4. BZOJ 2959 长跑 (LCT、并查集)
  5. matlab在统计学中的简单应用
  6. selenium切换窗口 java_WebDriver(Selenium2) 根据新窗口title切换窗口
  7. Developer Express .Net 2005 V7.2.1 crack
  8. 华为2017java笔试题_2017年java华为面试题
  9. 计算机组成原理——Cache与主存的地址映射
  10. SQL Server中追踪器Trace的介绍和简单使用-----(转)
  11. 【aviator】aviator 报错 Syntax error:Unexpect token 'OR' Parsing expression
  12. html判断用户名的合法性,javascript简单判断输入内容是否合法的方法
  13. SQL锁机制和事务隔离级别
  14. 快速重命名文件夹,教你怎样在每个文件夹名中添加符号
  15. redis通过key模糊搜索_jedis模糊查询key
  16. 涨知识 | 电机的十万个为什么?
  17. Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合
  18. java程序员自己的图片转文字OCR识图工具
  19. QT Creator + qt4.8.6配置报错:无法在环境变量中找到make命令: mingw32-make.exe问题解决
  20. APP爬虫| 逆向神器 frida 初试

热门文章

  1. 95-872-060-源码-CEP-匹配事件提取
  2. 【ElasticSearch】Es 源码之 Exporters 源码解读
  3. 【kafka】kafka Producer Metadata概述及源码分析
  4. 【clickhouse】clickhouse 表引擎之 set
  5. 「kafka」kafka增加主分区
  6. 【Elasticsearch】elasticsearch 常用 API 介绍
  7. 【Elasticsearch】Elasticsearch的数据类型 (text、keyword、date、object、geo等)
  8. 【ES】ES 7.6报错 SearchPhaseExecutionException: all shards failed OutOfMemoryError
  9. Spark报错 Failed to send RPC xxx to/ip:43074 java.nio.channels.ClosedChannelException
  10. 【JVM】三色标记法与读写屏障