Java开发笔记(一百二十二)AWT选择框
前面介绍了两种文本输入框的用法,不过实际应用很少需要用户亲自文字,而是在界面上列出几个选项,让用户勾勾点点完成选择,这样既方便也不容易弄错。依据选择的唯一性,可将选项控件分为两类:一类是在方框中打勾的复选框,多个复选框允许同时勾选;另一类是在圆圈中点选的单选框,一组单选框最多只能选中一个。
AWT实现复选功能的控件名叫Checkbox,它由两部分组成,左边部分是个支持打勾的方框,右边部分是说明文字。Checkbox类似一种特殊的按钮,只不过Button的文字在按钮内部,而Checkbox的文字在方框右边。对于说明文字来说,可以调用setText方法设置文本内容,还可调用setFont方法设置文本字体。对于整个复选框的单击事件而言,则需调用addItemListener方法给复选框添加点击监听器,一旦发生单击事件,就会触发监听器的itemStateChanged方法,在该方法内即可判断复选框的选中状态并开展后续处理。
接下来准备在窗口上添加三个复选框,模拟餐厅的点菜过程,看看不同的勾选组合将会得到怎样的菜单。首先要在窗口上添加三个复选框对应三道菜肴,同时添加两个文本标签,一个标签展示当前的勾选结果,另一个展示已经点了的菜单,对应的控件创建与面板添加代码如下所示:
Label labelCenter = new Label("这里查看勾选结果"); // 创建一个文本标签
Panel panelCenter = new Panel(); // 创建中央面板
panelCenter.add(labelCenter); // 在中央面板上添加文本标签
frame.add(panelCenter, BorderLayout.CENTER); // 把中央面板添加到窗口的中间位置
Label labelBottom = new Label("这里查看点的菜单"); // 创建一个文本标签
labelBottom.setPreferredSize(new Dimension(420, 30)); // 设置文本标签的推荐宽高
Panel panelBottom = new Panel(); // 创建底部面板
panelBottom.add(labelBottom); // 在底部面板上添加文本标签
frame.add(panelBottom, BorderLayout.SOUTH); // 把底部面板添加到窗口的南边(下方)
Panel panelTop = new Panel(); // 创建顶部面板
Checkbox ck1 = new Checkbox("麻婆豆腐"); // 创建一个复选框
Checkbox ck3 = new Checkbox("清蒸桂花鱼"); // 创建一个复选框
Checkbox ck2 = new Checkbox("香辣小龙虾"); // 创建一个复选框
panelTop.add(ck1); // 在顶部面板上添加复选框
panelTop.add(ck2); // 在顶部面板上添加复选框
panelTop.add(ck3); // 在顶部面板上添加复选框
frame.add(panelTop, BorderLayout.NORTH); // 把顶部面板添加到窗口的北边(上方)
Checkbox[] boxArray = new Checkbox[]{ck1, ck2, ck3}; // 构建复选框数组
然后定义一个获取菜单描述的方法,每次变动菜单都重新调用该方法,通过复选框的getState方法判断都有哪些菜肴被选中了。获取菜单的方法代码示例如下:
// 获取已经选定的菜单
private static String getCheckedItem(Checkbox[] boxArray) {
String itemDesc = "";
for (Checkbox box : boxArray) { // 遍历复选框数组
if (box.getState() == true) { // 复选框被选中了
if (itemDesc.length() > 0) {
itemDesc = itemDesc + "、";
}
itemDesc = itemDesc + box.getLabel(); // 菜单添加选定的菜肴
}
}
return itemDesc;
}
再给三个复选框依次添加点击监听器,每当发生单击事件之时,就立即显示勾选结果,并刷新勾选后的实时菜单。下面是分别给三个复选框注册监听器的代码例子:
ck1.addItemListener(new ItemListener() { // 给复选框添加一个点击监听器
public void itemStateChanged(ItemEvent e) { // 复选框的状态发生变化
// getStateChange方法用于获取复选框的当前状态。1为勾选,0为取消勾选
labelCenter.setText(String.format("您%s了%s",
(e.getStateChange() == 1 ? "点" : "取消"), ck1.getLabel()));
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.getLabel()));
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.getLabel()));
labelBottom.setText("当前已点菜肴包括:" + getCheckedItem(boxArray));
}
});
运行上述整理完的复选框操作代码,弹出的初始窗口界面如下图所示。
从左往右依次勾选三个复选框,每次勾选之后的窗口界面分别如下列三张图所示。
除了复选框,AXT也支持单选框,而且单选框同样使用Checkbox实现。区别之处在于,单选框引入了选择框小组CheckboxGroup,只要几个Checkbox加入了同一小组,这些Checkbox统统摇身变为圆形的单选框。一旦点击选中某个单选框,小组内部的其余单选框都会取消选中。想让Checkbox加入单选小组倒也简单,调用带三个参数的构造方法即可,第一个参数仍然是说明文字,第二个参数则是小组对象,第三个参数表示是否默认选中。故而只需在复选框的基础上修改以下代码,就实现了单选框的功能:
CheckboxGroup group = new CheckboxGroup(); // 创建一个选择框的小组
// 创建一个加入了小组的单选框,并且默认未选中
Checkbox ck1 = new Checkbox("鱼香肉丝饭", group, false);
// 创建一个加入了小组的单选框,并且默认已选中
Checkbox ck2 = new Checkbox("香菇滑鸡饭", group, true);
// 创建一个加入了小组的单选框,并且默认未选中
Checkbox ck3 = new Checkbox("黑椒牛排饭", group, false);
把以上代码替换进原来的复选框代码,重新运行测试程序,弹出的初始窗口界面如下图所示。
从图示可见,套餐小组默认选中了第二个单选框的“香菇滑鸡饭”。接着单击第三个单选框的“黑椒牛排饭”,刷新后的窗口界面如下图所示:
此时第三个单选框被选中,同时第二个单选框取消了选中,说明的确实现了单选框的唯一选中功能。
更多Java技术文章参见《Java开发笔记(序)章节目录》
Java开发笔记(一百二十二)AWT选择框的更多相关文章
- Java开发笔记(三十二)字符型与整型相互转化
前面提到字符类型是一种新的变量类型,然而编码实践的过程中却发现,某个具体的字符值居然可以赋值给整型变量!就像下面的例子代码那样,把字符值赋给整型变量,编译器不但没报错,而且还能正常运行! // 字符允 ...
- Java开发笔记(八十二)注解的基本单元——元注解
Java的注解非但是一种标记,还是一种特殊的类型,并且拥有专门的类型定义.前面介绍的五种内置注解,都可以找到对应的类型定义代码,例如查看注解@Override的源码,发现它的代码定义是下面这样的: @ ...
- Java开发笔记(四十二)日历工具的常见应用
前面介绍了日历工具Calendar的基本用法,乍看起来Calendar与Date两个半斤八两,似乎没有多大区别,那又何苦庸人自扰鼓捣一个新玩意呢?显然这样小瞧了Calendar,其实它的作用大着呢,接 ...
- Java开发笔记(五十二)对象的类型检查
前面介绍了类的多态性,来自于鸡类的实例chicken,既能用来表达公鸡实例,也能用来表达母鸡实例.可是这导致了一个问题,假如在call方法内部需要手工判断输入参数属于公鸡实例还是母鸡实例,那该如何是好 ...
- Java开发笔记(六十二)如何定义函数式接口
前面介绍了Lambda表达式的用法,从实践中发现它确实极大地方便了开发者,然而不管是匿名内部类还是Lambda表达式,所举的例子都离不开各类数组的排序方法,倘使Lambda表达式仅能用于sort方法, ...
- Java开发笔记(七十二)Java8新增的流式处理
通过前面几篇文章的学习,大家应能掌握几种容器类型的常见用法,对于简单的增删改和遍历操作,各容器实例都提供了相应的处理方法,对于实际开发中频繁使用的清单List,还能利用Arrays工具的asList方 ...
- Java开发笔记(三十八)利用正则表达式校验字符串
前面多次提到了正则串.正则表达式,那么正则表达式究竟是符合什么定义的字符串呢?正则表达式是编程语言处理字符串格式的一种逻辑式子,它利用若干保留字符定义了形形色色的匹配规则,从而通过一个式子来覆盖满足了 ...
- Java开发笔记(三十九)日期工具Date
Date是Java最早的日期工具,编程中经常通过它来获取系统的当前时间.当然使用Date也很简单,只要一个new关键字就能创建日期实例,就像以下代码示范的那样: // 创建一个新的日期实例,默认保存的 ...
- Java开发笔记(四十)日期与字符串的互相转换
前面介绍了如何通过Date工具获取各个时间数值,但是用户更喜欢形如“2018-11-24 23:04:18”这种结构清晰.简洁明了的字符串,而非啰里八唆依次汇报每个时间单位及其数值的描述.既然日期时间 ...
- Java开发笔记(八十四)文件与目录的管理
程序除了处理内存中的数据结构,还要操作磁盘上的各类文件,这里的磁盘是个统称,泛指可以持久保留数据的存储介质,包括但不限于:插在软驱中的软盘.固定在机箱中的硬盘.插在光驱中的光盘.插在USB接口上的U盘 ...
随机推荐
- 看图轻松理解数据结构与算法系列(NoSQL存储-LSM树) - 全文
<看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的样子. 关于LSM树 ...
- learning java NIO 之 RandomFileChannel
import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.i ...
- 洛谷 P2312 解方程 题解
P2312 解方程 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 [1,m][1,m] 内的整数解(\(n\) 和 \(m\) 均为 ...
- SQL基础-约束&索引
一.约束 1.约束简介 约束(constraint): 表中数据的限制条件. 完整性 有效性 约束的种类: 主键约束 外键约束 唯一约束 检查约束 非空约束 2.主键约束 主键约束: 唯一标识表中每一 ...
- .bat批处理命令之设置关机倒计时脚本
@ECHO off REM 不显示后续命令行及当前命令行 TITLE Shutdown countdown REM 设置脚本标题 COLOR 0A REM 设置脚本 背景色为黑色 前景色为淡绿色 :s ...
- Shell脚本实现对文件编辑
常见Linux文件的编辑命令 vi/vim,有时候我们想写一个脚本实现对文件编辑,这个时候,可能就不够用了,下面介绍一些办法 1.echo命令 Shell的echo命令常用于字符串的输出 例如: [r ...
- MySQL8.0报错Can't connect to MySQL server on 'localhost' (10061)的解决办法
MySQL8.0报错Can't connect to MySQL server on 'localhost' (10061)的解决办法 事情的起因 今天课堂上要展示小组项目,需要用一个软件叫W ...
- Java_jdbc 基础笔记之九 数据库连接 (查询Customer对象的方法)
/** * * 写一个查询Customer对象的方法 * */ public Customer getCustomer(String sql, Object... args) { Customer c ...
- Multi-Agent Reinforcement Learning Based Frame Sampling for Effective Untrimmed Video Recognition
Multi-Agent Reinforcement Learning Based Frame Sampling for Effective Untrimmed Video Recognition IC ...
- Android -------- BouncingJellyView 果冻视图(阻尼效果)
分享一个不错的效果,分享给大家 BouncingJellyView 果冻视图,就像果冻一样伸缩弹跳,也叫阻尼效果.这个效果在MIUI上面到处都可以看到. 效果图: 使用 项目更目录bulid.grad ...