不管是AWT还是Swing,都把选择框分成两类:复选框和单选按钮,这两类控件无论是外观上还是功能上均有显著差异。例如,在外观方面,复选框是在方框内打勾,而单选按钮是在圆圈内画圆点;在功能方面,复选框允许多选,而同组的单选按钮只能选择其中一个。然而AWT的复选框和单选按钮统统采用Checkbox类型,区别之处在于是否加入了单选组CheckboxGroup。这不可避免又带来困惑,同样是Checkbox类型,代码该如何区分某个选择框到底是复选框还是单选按钮?显然AWT的控件设计很不合理,非常容易引起混淆,为此Swing干脆将它俩彻底分开,各自分配对应的控件类型,从此井水不犯河水,大家才能相安无事。
Swing给复选框起的名字叫JCheckBox,该控件与AWT的Checkbox用法相似,但在细节上存在下列差异:
1、对于JCheckBox来说,setLabel方法已经废弃,改为使用统一的setText方法来设置文本。同时获取控件文本的getLabel方法也改成了getText方法。
2、getState方法被直接取消了,JCheckBox改为调用isSelected方法判断当前复选框是否选中。同时设置选中状态的setState方法也改成了setSelected方法。
下面是利用JCheckBox点菜的代码例子:

		JPanel panelTop = new JPanel(); // 创建顶部面板
JCheckBox ck1 = new JCheckBox("麻婆豆腐"); // 创建一个复选框
JCheckBox ck3 = new JCheckBox("清蒸桂花鱼"); // 创建一个复选框
JCheckBox ck2 = new JCheckBox("香辣小龙虾"); // 创建一个复选框
panelTop.add(ck1); // 在顶部面板上添加复选框
panelTop.add(ck2); // 在顶部面板上添加复选框
panelTop.add(ck3); // 在顶部面板上添加复选框
frame.add(panelTop, BorderLayout.NORTH); // 把顶部面板添加到窗口的北边(上方)
JCheckBox[] boxArray = new JCheckBox[]{ck1, ck2, ck3}; // 构建复选框数组
ck1.addItemListener(new ItemListener() { // 给复选框添加一个点击监听器
public void itemStateChanged(ItemEvent e) { // 复选框的状态发生变化
// getStateChange方法用于获取复选框的当前状态。1为勾选,0为取消勾选
labelCenter.setText(String.format("您%s了%s",
(e.getStateChange() == 1 ? "点" : "取消"), ck1.getText()));
labelBottom.setText("当前已点菜肴包括:" + getCheckedItem(boxArray));
}
});
ck2.addItemListener(new ItemListener() { // 给复选框添加一个点击监听器
public void itemStateChanged(ItemEvent e) { // 复选框的状态发生变化
// getStateChange方法用于获取复选框的当前状态。1为勾选,0为取消勾选
labelCenter.setText(String.format("您%s了%s",
(e.getStateChange() == 1 ? "点" : "取消"), ck2.getText()));
labelBottom.setText("当前已点菜肴包括:" + getCheckedItem(boxArray));
}
});
ck3.addItemListener(new ItemListener() { // 给复选框添加一个点击监听器
public void itemStateChanged(ItemEvent e) { // 复选框的状态发生变化
// getStateChange方法用于获取复选框的当前状态。1为勾选,0为取消勾选
labelCenter.setText(String.format("您%s了%s",
(e.getStateChange() == 1 ? "点" : "取消"), ck3.getText()));
labelBottom.setText("当前已点菜肴包括:" + getCheckedItem(boxArray));
}
});

以上代码出现的getCheckedItem方法用来获取已经选定的菜单,该方法的定义代码示例如下:

	// 获取已经选定的菜单
private static String getCheckedItem(JCheckBox[] boxArray) {
String itemDesc = "";
for (JCheckBox box : boxArray) { // 遍历复选框数组
if (box.isSelected() == true) { // 复选框被选中了
if (itemDesc.length() > 0) {
itemDesc = itemDesc + "、";
}
itemDesc = itemDesc + box.getText(); // 菜单添加选定的菜肴
}
}
return itemDesc;
}

运行上述的复选框测试代码,弹出窗口的初始界面如下图所示。


从左往右依次勾选三个复选框,每次勾选后的界面效果分别如下列三张图片所示。


至于单选按钮,Swing给它分配了专门的控件类型名叫JRadioButton,该控件的自身方法类似于JCheckBox,一样引入了setText、getText、isSelected、setSelected等新方法替换AWT的旧方法。并且Swing给JRadioButton找了个按钮小组搭档,名叫ButtonGroup,只要多次调用小组对象的add方法,就能将若干个单选按钮加到同一小组。下面是与ButtonGroup有关的调用代码:

		ButtonGroup group = new ButtonGroup(); // 创建一个按钮小组
group.add(rb1); // 把单选按钮1加入到按钮小组
group.add(rb2); // 把单选按钮2加入到按钮小组
group.add(rb3); // 把单选按钮3加入到按钮小组

接着把JRadioButton与ButtonGroup整合在一起,打算实现简单的点餐功能,完整的调用代码如下所示:

		JPanel panelTop = new JPanel(); // 创建顶部面板
// 创建单选按钮,并且默认未选中
JRadioButton rb1 = new JRadioButton("鱼香肉丝饭", false);
// 创建单选按钮,并且默认已选中
JRadioButton rb2 = new JRadioButton("香菇滑鸡饭", true);
// 创建单选按钮,并且默认未选中
JRadioButton rb3 = new JRadioButton("黑椒牛排饭", false);
panelTop.add(rb1); // 在顶部面板上添加单选按钮
panelTop.add(rb2); // 在顶部面板上添加单选按钮
panelTop.add(rb3); // 在顶部面板上添加单选按钮
frame.add(panelTop, BorderLayout.NORTH); // 把顶部面板添加到窗口的北边(上方)
ButtonGroup group = new ButtonGroup(); // 创建一个按钮小组
group.add(rb1); // 把单选按钮1加入到按钮小组
group.add(rb2); // 把单选按钮2加入到按钮小组
group.add(rb3); // 把单选按钮3加入到按钮小组
rb1.addItemListener(new ItemListener() { // 给单选按钮添加一个点击监听器
public void itemStateChanged(ItemEvent e) { // 单选按钮被选中
label.setText("您点了" + rb1.getText()); // 在标签上显示当前选中的单选按钮文本
}
});
rb2.addItemListener(new ItemListener() { // 给单选按钮添加一个点击监听器
public void itemStateChanged(ItemEvent e) { // 单选按钮被选中
label.setText("您点了" + rb2.getText()); // 在标签上显示当前选中的单选按钮文本
}
});
rb3.addItemListener(new ItemListener() { // 给单选按钮添加一个点击监听器
public void itemStateChanged(ItemEvent e) { // 单选按钮被选中
label.setText("您点了" + rb3.getText()); // 在标签上显示当前选中的单选按钮文本
}
});

运行上面的单选按钮测试代码,弹出窗口的初始界面如下图所示。

然后从左往右依次单击三个按钮,每次单击后的界面效果分别如下列三张图片所示。


更多Java技术文章参见《Java开发笔记(序)章节目录

Java开发笔记(一百三十)Swing的选择框的更多相关文章

  1. Java开发笔记(三十八)利用正则表达式校验字符串

    前面多次提到了正则串.正则表达式,那么正则表达式究竟是符合什么定义的字符串呢?正则表达式是编程语言处理字符串格式的一种逻辑式子,它利用若干保留字符定义了形形色色的匹配规则,从而通过一个式子来覆盖满足了 ...

  2. Java开发笔记(三十九)日期工具Date

    Date是Java最早的日期工具,编程中经常通过它来获取系统的当前时间.当然使用Date也很简单,只要一个new关键字就能创建日期实例,就像以下代码示范的那样: // 创建一个新的日期实例,默认保存的 ...

  3. Java开发笔记(三十)大小数BigDecimal

    前面介绍的BigInteger只能表达任意整数,但不能表达小数,要想表达任意小数,还需专门的大小数类型BigDecimal.如果说设计BigInteger的目的是替代int和long类型,那么设计Bi ...

  4. Java开发笔记(三十二)字符型与整型相互转化

    前面提到字符类型是一种新的变量类型,然而编码实践的过程中却发现,某个具体的字符值居然可以赋值给整型变量!就像下面的例子代码那样,把字符值赋给整型变量,编译器不但没报错,而且还能正常运行! // 字符允 ...

  5. Java开发笔记(三十四)字符串的赋值及类型转换

    不管是基本的char字符型,还是包装字符类型Character,它们的每个变量只能存放一个字符,无法满足对一串字符的加工.为了能够直接操作一连串的字符,Java设计了专门的字符串类型String,该类 ...

  6. Java开发笔记(三十五)字符串格式化

    前面介绍了字符串变量的四种赋值方式,对于简单的赋值来说完全够用了,即便是两个字符串拼接,也只需通过加号把两个目标串连起来即可.但对于复杂的赋值来说就麻烦了,假设现在需要拼接一个很长的字符串,字符串内部 ...

  7. Java开发笔记(三十六)字符串的常用方法

    不管是给字符串赋值,还是对字符串格式化,都属于往字符串填充内容,一旦内容填充完毕,则需开展进一步的处理.譬如一段Word文本,常见的加工操作就有查找.替换.追加.截取等等,按照字符串的处理结果异同,可 ...

  8. Java开发笔记(四十)日期与字符串的互相转换

    前面介绍了如何通过Date工具获取各个时间数值,但是用户更喜欢形如“2018-11-24 23:04:18”这种结构清晰.简洁明了的字符串,而非啰里八唆依次汇报每个时间单位及其数值的描述.既然日期时间 ...

  9. Java开发笔记(八十九)缓存字节I/O流

    文件输出流FileOutputStream跟FileWriter同样有个毛病,每次调用write方法都会直接写到磁盘,使得频繁的写操作性能极其低下.正如FileWriter搭上了缓存兄弟Buffere ...

  10. Java开发笔记(八十六)通过缓冲区读写文件

    前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作“字符流I/O”,其中字母I代表输入Input,字母O ...

随机推荐

  1. 通过USB 2.0电缆手动设置内核模式调试

    Windows的调试工具支持通过USB 2.0电缆进行内核调试.本文介绍如何手动设置USB 2.0调试.通过USB 2.0电缆进行调试需要以下硬件: USB 2.0调试电缆.此电缆不是标准USB 2. ...

  2. 【批处理】choice命令,call 命令,start 命令,rem

    [1]choice命令简介 使用此命令可以提示用户输入一个选择项,根据用户输入的选择项再决定执行具体的过程. 使用时应该加/c:参数,c: 后应写提示可输入的字符或数字,之间无空格.冒号是可选项. 使 ...

  3. less简介及其编译原理

    一.less环境安装 ①首先需要在电脑上安装nodejs,一般会内置npm,利用以下命令可以检测: ②利用npm在线安装less,运行  npm install –g less ③查看是否安装成功,L ...

  4. 干货 | 10分钟带你全面掌握branch and bound(分支定界)算法-概念篇

    00 前言 之前一直做启发式算法,最近突然对精确算法感兴趣了.但是这玩意儿说实话是真的难,刚好boss又叫我学学column generation求解VRP相关的内容.一看里面有好多知识需要重新把握, ...

  5. 2015-2016-2《Java程序设计》团队博客5

    一.项目进展 本周将所有的项目代码全部进行了汇总总结,归纳在了一起,进行整体的测试.虽然在编写的时候很顺利,也就是片段代码问题不大,但是汇总到一起时还是产生了冲突与不对等的问题,所以我们只能仔细地从细 ...

  6. Selenium自动化对非输入框的日历或日期控件的处理

    4.这个时候我们可以移除readonly的属性,问题就轻轻松松解决了,代码如下: String js = "document.getElementById('createTime').rem ...

  7. java里的数组和list分别在什么情况下使用?

    数组长度固定,List未限定长度,且支持的功能更多,最常用的ArrayList底层实际上也是使用数组实现. 不需要复杂功能和确定长度的情况下,使用数组效率更高,通常情况建议使用List.

  8. NFS的安装与使用

    一.服务器端: 1.1安装NFS服务: #执行以下命令安装NFS服务器, #apt会自动安装nfs-common.rpcbind等13个软件包 sudo apt install nfs-kernel- ...

  9. np.stack

  10. EF6中的SQL监控

    在MVC或WEBAPI中的监控 System.Action<string> action = (string message) => { Debug.WriteLine(messag ...