石 家 庄 铁 道 大 学
实 验 报 告
实验项目名称:黑盒测试
一、 实验目的
1、 掌握黑盒测试的基础知识;
2、 掌握黑盒测试的检查内容及测试目的;
3、 掌握黑盒测试的几种基本测试方法:等价类划分方法、边界值分析方法、因果图法、决策表法和场景法;
二、 实验内容
实验题目
1、设计函数实现输入日期显示星期几,并用等价类及边界值法测试
实验步骤:
① 设计程序
源程序见学习通平台。
② 划分等价类,得到等价类表。等价类表格式如下:
输入条件 |
有效等价类 |
唯一标识 |
无效等价类 |
唯一标识 |
年份 |
1900到2050内的平年整数 |
1 |
年份 < 1900 |
10 |
1900到2050内的闰年整数 |
2 |
年份 > 2050 |
11 |
|
|
|
年份包括非数字字符 |
12 |
|
月份 |
1、3、5、7、8、10、12 |
3 |
月份 < 0 |
13 |
4、6、9、11 |
4 |
月份 > 13 |
14 |
|
2 |
5 |
月份包括非数字字符 |
15 |
|
日期 |
1 <= 日期 <= 28 |
6 |
日 < 0 |
16 |
日期 = 29 |
7 |
日 > 31 |
17 |
|
日期 = 30 |
8 |
日期包含非数字字符 |
18 |
|
日期 = 31 |
9 |
年份为闰年且月份为2月且日期大于29 |
19 |
|
|
|
年份为平年且月份为2月且日期大于28 |
20 |
|
|
|
月份为4、6、9、11且日期大于30 |
21 |
③ 运用等价类划分法设计测试用例,得到测试用例表。测试用例表格式如下:
序号 |
输入数据 |
覆盖等价类 |
输出 |
1 |
2002、1、19 |
1、3、6 |
合法日期 |
2 |
2003、4、29 |
1、4、7 |
合法日期 |
3 |
2000、3、30 |
2、3、8 |
合法日期 |
4 |
2000、3、31 |
2、3、9 |
合法日期 |
5 |
2000、2、29 |
2、5、7 |
日期非法 |
6 |
1880、1、1 |
10 |
年份非法 |
7 |
2055、2、3 |
11 |
年份非法 |
8 |
12HS、3、1 |
12 |
含非数字字符 |
9 |
2002、-1、3 |
13 |
月份非法 |
10 |
2030、14、2 |
14 |
月份非法 |
11 |
2030、14、HH |
15 |
含非数字字符 |
12 |
1990、12、-2 |
16 |
日期非法 |
13 |
2022、3、31 |
17 |
日期非法 |
14 |
2014、4、HH |
18 |
含非数字字符 |
15 |
2000、2、30 |
19 |
日期非法 |
16 |
2001、2、29 |
20 |
日期非法 |
17 |
2034、4、29 |
21 |
合法日期 |
④ 运用边界值法设计测试用例。
序号 |
输入数据 |
预测输出 |
实际输出 |
1 |
1900,12,3 |
合法日期 |
合法日期 |
2 |
1901,11,3 |
合法日期 |
合法日期 |
3 |
2050,1,3 |
合法日期 |
合法日期 |
4 |
2049,2,4 |
合法日期 |
合法日期 |
5 |
2036,12,3 |
合法日期 |
合法日期 |
6 |
2024,11,21 |
合法日期 |
合法日期 |
7 |
2008,1,23 |
合法日期 |
合法日期 |
8 |
2010,2,17 |
合法日期 |
合法日期 |
9 |
2003,3,27 |
合法日期 |
合法日期 |
10 |
2009,2,28 |
合法日期 |
合法日期 |
11 |
2110,2,29 |
年份非法 |
年份非法 |
12 |
2007,4,30 |
合法日期 |
合法日期 |
13 |
2008,12,31 |
合法日期 |
合法日期 |
14 |
2006,6,23 |
合法日期 |
合法日期 |
2、找零钱最佳组合
假设商店货品价格(R) 都不大于100元(且为整数),若顾客付款(P)在100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。 假定此商店的货币面值只包括:50元(N50)、10元(N10)、 5元(N5)、1元(N1) 四种。
请结合等价类划分法和边界值分析法为上述程序设计 出相应的测试用例。
实验步骤:
④ 设计程序
源程序见学习通平台。
⑤ 划分等价类,得到等价类表。等价类表格式如下:
输入条件 |
有效等价类 |
唯一标识 |
无效等价类 |
唯一标识 |
货品价格(R) |
0 <= R <= 100 |
1 |
R > 100 |
3 |
R为整数 |
2 |
R < 0 |
4 |
|
|
|
R 非整数数字 |
5 |
|
付款(P) |
0 <= P <= 100 |
6 |
P > 100 |
8 |
P >= R |
7 |
P < 0 |
9 |
|
P为整数 |
11 |
P 非整数数字 |
10 |
|
|
|
|
P < R |
11 |
⑥ 运用等价类划分法设计测试用例,得到测试用例表。测试用例表格式如下:
序号 |
输入数据 |
覆盖等价类 |
输出 |
1 |
90,23 |
1,2,3,4,7 |
付款价钱不规范 |
2 |
101,23 |
3, |
价钱不规范 |
3 |
-2,34 |
4, |
价钱不规范 |
4 |
R,54 |
5 |
含非整数数字字符 |
5 |
12,102 |
8 |
付款价钱不规范 |
6 |
23,-1 |
9 |
付款价钱不规范 |
7 |
24,U |
10 |
含非整数数字字符 |
9 |
12,3 |
11 |
付款价钱不规范 |
④ 运用边界值法设计测试用例。
序号 |
输入数据 |
预测输出 |
实际输出 |
1 |
0,13 |
价钱不规范 |
价钱不规范 |
2 |
1,23 |
找零: {N1=2, N10=2} |
找零: {N1=2, N10=2} |
3 |
99,32 |
付款价钱不规范 |
付款价钱不规范 |
4 |
100,23 |
价钱不规范 |
价钱不规范 |
5 |
23,0 |
付款价钱不规范 |
付款价钱不规范 |
6 |
43,1 |
付款价钱不规范 |
付款价钱不规范 |
7 |
34,99 |
找零: {N5=1, N50=1, N10=1} |
找零: {N5=1, N50=1, N10=1} |
8 |
65,100 |
付款价钱不规范 |
付款价钱不规范 |
9 |
34,56 |
找零: {N1=2, N10=2} |
找零: {N1=2, N10=2} |
3、有一个饮料自动售货机(处理单价为5角钱)的控制处理软件,它的软件规格说明如下:
若投入5角钱的硬币,按下“橙汁”或“啤酒”的按钮,则相应的饮料就送出来。若投入1元钱的硬币,同样也是按“橙汁”或“啤酒”的按钮,则自动售货机在送出相应饮料的同时退回5角钱的硬币。
模拟程序如下:
用因果图法测试该程序,并撰写实验报告。
实验步骤:
①编写程序
源程序见学习通平台。
②分析原因与结果,与同学交换程序测试。
结果:
1:出5角钱 ---》 投1元钱,按下任意按钮
2:出啤酒 ----》 投币,按下啤酒按钮
3:出橙汁 ----》 投币,按下橙汁按钮
③画出因果图
④转化为决策表
|
选项规则 |
1 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
14 |
15 |
条件 |
投0.5元 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
投1元 |
1 |
0 |
0 |
0 |
0 |
- |
1 |
1 |
1 |
0 |
0 |
|
按啤酒 |
- |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
|
按橙汁 |
- |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
- |
|
已投钱 |
|
|
1 |
1 |
|
|
1 |
1 |
|
|
|
|
已按按钮 |
|
|
1 |
1 |
|
|
1 |
1 |
|
|
|
|
动作 |
出啤酒 |
|
|
1 |
|
|
|
1 |
|
|
|
|
出橙汁 |
|
|
|
1 |
|
|
|
1 |
|
|
|
|
出五角钱 |
|
|
|
|
|
|
1 |
1 |
|
|
|
|
错误操作 |
1 |
1 |
|
|
1 |
1 |
|
|
1 |
1 |
1 |
⑤根据决策表设计测试用例,得到测试用例表
测试用例编号 |
输入数据 |
预期输出 |
实际输出 |
1 |
投0.5元+按啤酒 |
出啤酒 |
啤酒 |
2 |
投0.5元+按橙汁 |
出橙汁 |
橙子 |
3 |
投1元 + 按啤酒 |
出啤酒 + 5角钱 |
出啤酒 + 5角钱 |
4 |
投1元 + 按橙汁 |
出橙汁 + 5角钱 |
出橙汁 + 5角钱 |
5 |
按啤酒 |
弹提示 |
弹提示 |
6 |
按橙汁 |
弹提示 |
弹提示 |
7 |
投0.5元 |
弹提示 |
弹提示 |
8 |
投1元 |
弹提示 |
弹提示 |
4、航空服务查询问题:根据航线,仓位,飞行时间查询航空服务。
假设一个中国的航空公司规定:
① 中国去欧美的航线所有座位都有食物供应,每个座位都可以播放电影。
② 中国去非欧美的国外航线都有食物供应,只有商务仓可以播放电影。
③ 中国国内的航班的商务仓有食物供应,但是不可以播放电影
④ 中国国内航班的经济仓只有当飞行时间大于2小时时才有食物供应,但是不可以播放电影。
请用程序实现上述功能,并用决策表法设计测试用例,再执行测试,撰写实验报告。
实验步骤:
① 编写程序,与同学交换程序测试。
② 构造决策表
|
|
序号 |
1 |
2 |
3 |
4 |
5 |
6 |
条件 |
航线
|
欧美 |
1 |
0 |
0 |
0 |
0 |
0 |
非欧美 |
0 |
1 |
1 |
0 |
0 |
0 |
||
国内 |
0 |
0 |
0 |
1 |
1 |
1 |
||
机舱 |
商务仓 |
- |
1 |
0 |
1 |
0 |
0 |
|
经济仓 |
- |
0 |
1 |
0 |
1 |
1 |
||
时间 |
2小时内 |
- |
- |
- |
- |
1 |
0 |
|
大于2小时 |
- |
- |
- |
- |
0 |
1 |
||
动作 |
食物供应 |
1 |
1 |
1 |
1 |
0 |
1 |
|
播放电影 |
1 |
1 |
0 |
0 |
0 |
0 |
③ 根据决策表设计测试用例,得到测试用例表
欧美:A1 非欧美:A2 国内:A3 商务仓:B1 经济舱:B2 小于等于2小时:C1
大于两小时:C2
食物供应:D1 播放电影:D2 D3:无服务
序号 |
测试用例 |
预期结果 |
实际结果 |
1 |
A1 B1 C1 |
D1、D2 |
D1、D2 |
2 |
A2 B1 C1 |
D1、D2 |
D1、D2 |
3 |
A2 B2 C1 |
D1、 |
D1 |
4 |
A3 B1 C1 |
D1、 |
D1 |
5 |
A3 B2 C1 |
D3 |
D3 |
6 |
A3 B2 C2 |
D1、 |
D1 |
5、旅馆住宿系统中,旅馆业主可进行添加房间操作。
旅馆业主登录旅馆住宿系统后,可以请求添加房间;
待进入“房间管理”对话框,单击“添加”按钮可进行添加房间操作;
添加房间时,可以设定房间的房间编号、房间类型、房间描述信息;
添加房间信息不能缺失,若某一项未填写,要给出提示信息;
房间编号长度不超过5个字符;
房间描述长度不超过1000个字符;
房间信息不能重复,成功填写后,可进行保存或取消操作,之后返回“房间管理”对话框,结束添加房间流程。
实验步骤:
利用黑盒测试策略编写添加房间功能的测试用例。
①等价类划分:
输入条件 |
有效等价类 |
唯一标识 |
无效等价类 |
唯一标识 |
房间编号 |
0 < 长度 <= 5 |
1 |
长度 > 5 |
2 |
|
|
长度 = 0 |
3 |
|
房间类型 |
非空 |
4 |
空 |
5 |
房间描述信息 |
0 < 长度 <= 1000 |
6 |
长度 > 1000 |
7 |
|
|
长度 = 0 |
9 |
|
|
|
房间编号重复 |
10 |
②测试用例表格式如下:
序号 |
输入数据 |
覆盖等价类 |
输出 |
1 |
1,单人间,100元一晚 |
1,4,6 |
操作成功 |
2 |
111111,单人间,100元一晚 |
2 |
房间编号不超过5个字符 |
3 |
,单人间,100元一晚 |
3 |
房间编号非空 |
4 |
2,,100元一晚 |
5 |
房间类型非空 |
5 |
3,单人间,, |
7 |
房间描述非空 |
6 |
4,单人间,100元一晚..... |
9 |
房间编号不超过1000个字符 |
7 |
1,单人间,100元一晚 |
10 |
房间信息重复 |
③运用边界值法设计测试用例。
序号 |
输入数据 |
预测输出 |
1 |
1,单人间,100元一晚 |
操作成功 |
2 |
12,单人间,100元一晚 |
操作成功 |
3 |
1222,单人间,100元一晚 |
操作成功 |
4 |
12222,单人间,100元一晚 |
操作成功 |
5 |
23,单人间,1 |
操作成功 |
6 |
34,单人间,10 |
操作成功 |
7 |
5,单人间,100元一晚...X999 |
操作成功 |
8 |
6,单人间,100元一晚...X1000 |
操作成功 |
9 |
56,单人间,100元一晚 |
操作成功 |
④:场景法进行测试
V表示这个条件必须是有效的才可执行基本流
I表示这种条件下将激活所需备选流
n/a表示这个条件不适用于测试用例
用例ID |
场景 |
登录 |
添加合理信息 |
预测结果 |
1 |
登录->房间管理->添加->设置信息->保存/取消->房间管理 |
V |
V |
添加信息成功 |
2 |
登录->登录失败 |
I |
n/a |
登录失败 |
3 |
登录->房间管理->添加->设置信息->输入不合理->房间管理 |
V |
I |
添加失败,退回管理界面 |
三、 个人体会
1、在实际的测试中,如何设计测试用例才能达到用最少的测试用例检测出最多的缺陷;
要进行多种方法的检验和使用,首先要先考虑划分等价类,对于输入进行划分,进行一个最全面的规划,其次,对于一些问题,有着对应的测试方法,如决策表,因果图,等等。
首先进行等价类划分,包括输入条件和输出条件的等价划分,将无限测试变成有限测试,在任何情况下,都必须使用边界值分析法。可以用错误推测法追加一些用例,这需要依靠测试工程师的经验。对照程序逻辑,检查出已设计出的测试用例的逻辑覆盖程度,如果没有足够覆盖,应当再补充足够的测试用例。如果程序说明中有输入条件的组合情况,则一开始就可以选用因果图或判定表驱动法设计测试用例。对于参数配置类型的软件,要用正交试验法选择较少的组合方式,达到最佳效果。对于业务流清晰的系统,可利用场景法贯穿整个测试案例过程,在案例中综合使用各种设计方法
2、在进行用例设计时,如何考虑软件测试用例的充分性和减少软件测试用例的冗余性;
首先要将用例的充分性进行优先考虑,测试就是要进行最全面的进行测试,对于冗余性,在影响程序小的的情况下,适当的冗余也可以接收,为了做到极可能全名的测试,对于冗余性我认为在数量不是贴别多的情况下可以接收,就如:边界值方法,有些会进行min-,max+,但是对于边界之外的数据,已经有专门的模块进行测试。
3、本次实验遇到的难点、如何解决的及体会。
难点:主要对于测试的概念不了解,对于等价类的划分,等价类的设计用例,就如:对于无效等价类的设计,边界值的设计要保证其余条件的正确性,来进行专门测试该等价类。对于决策表和判定表的理解不清,不能很好的进行区分,对于一些决策表的设计用例和实际程序运行时的结果不进行匹配,但找不错误。
解决:上网查找答案,自己想,询问老师
体会:对于黑盒测试的一些基本方法有了初步的了解,对于测试有了一些认知与体会,明白了写程序时应该注意的一些问题,但仍然存在一些问题,我认为是软件测试这个学科的问题,这个毕竟不是数学那样有逻辑,面向实际生活总是有例外。
代码:
public class Test1 { public static void check(Date date1){ int year,month,date; try { year = new Integer(date1.getYear()); month = new Integer(date1.getMonth()); date = new Integer(date1.getDate()); System.out.print( year +"年" + month + "月" + date +"日:"); } catch (NumberFormatException e) { System.out.println(date1.getYear() + "年" + date1.getMonth() + "月" + date1.getDate() +"日:"+"含非数字字符"); return; } // 判断年份 if(year > 2050 || year < 1900){ System.out.println("年份非法"); return; } // 判断月份 if(month > 12 || month < 0){ System.out.println("月份非法"); return; } // 判断合法日期 if (date > 31 || date < 0){ System.out.println("日期非法"); return; } // 判断31日 if( date == 31 && (month != 1 && month != 3 && month != 5 && month != 7 && month != 9 && month != 10 && month != 12)){ System.out.println("11"); System.out.println("日期非法"); return; } // 判断30日 if( date == 30 && month == 2){ System.out.println("日期非法"); return; } // 判断29日 if( date == 29 && month == 2){ System.out.println("日期非法"); return; } // 判断28日 if( date == 28 && month == 2 && ((year % 400 == 0)||(year % 4 == 0) && (year % 100 == 0))){ System.out.println("日期非法"); return; } System.out.println("合法日期"); } public static void main(String[] args) { Date date1 = new Date( "2002","1","19"); Date date2 = new Date("2003","4","29"); Date date3 = new Date( "2000","3","30"); Date date4 = new Date("2002","3","31"); Date date5 = new Date( "2002","2","29"); Date date6 = new Date("1880","1","1"); Date date7 = new Date( "2055","2","3"); Date date8 = new Date("12HS","3","1"); Date date9 = new Date("2002","-1","3"); Date date10 = new Date("2030","14","2"); Date date11 = new Date("2030","14","HH"); Date date12 = new Date("1990","12","-2"); Date date13 = new Date("2022","3","31"); Date date14 = new Date("2014","4","HH"); Date date15 = new Date("2000","2","30"); Date date16 = new Date("2001","2","29"); Date date17 = new Date("2034","4","29"); Date date18 = new Date("1900","12","3"); Date date19 = new Date("1901","11","3"); Date date20 = new Date("2050","1","3"); Date date21 = new Date("2049","2","4"); Date date22 = new Date("2036","12","3"); Date date23 = new Date("2024","11","21"); Date date24 = new Date("2008","1","23"); Date date25 = new Date("2010","2","17"); Date date26 = new Date("2003","3","27"); Date date27 = new Date("2009","2","28"); Date date28 = new Date("2110","2","29"); Date date29 = new Date("2007","4","30"); Date date30 = new Date("2008","12","31"); Date date31 = new Date("2006","6","23"); Date array[] = {date1,date2,date3,date4,date5,date6,date7,date8,date9,date10,date11,date12,date13,date14,date15,date16,date17,date18,date19, date20,date21,date22,date23,date24,date25,date26,date27,date28,date29,date30,date31}; for (int i = 0;i < array.length; i ++){ check(array[i]); } } static class Date{ private String Year; private String Month; private String Date; public Date(String year, String month, String date) { Year = year; Month = month; Date = date; } public String getYear() { return Year; } public void setYear(String year) { Year = year; } public String getMonth() { return Month; } public void setMonth(String month) { Month = month; } public String getDate() { return Date; } public void setDate(String date) { Date = date; } } }
import java.util.HashMap; import java.util.Map; public class Test2 { public static Map<String, Integer> calculateChange(int price, int payment) { Map<String, Integer> change = new HashMap<>(); int remainingChange = payment - price; int[] denominations = {50, 10, 5, 1}; String[] names = {"N50", "N10", "N5", "N1"}; for (int i = 0; i < denominations.length; i++) { int count = remainingChange / denominations[i]; if (count > 0) { change.put(names[i], count); remainingChange %= denominations[i]; } } return change; } public static void main(String[] args) { testChange("90", "23"); testChange("101", "23"); testChange("-2", "34"); testChange("R", "54"); testChange("12", "102"); testChange("23", "-1"); testChange("24", "U"); testChange("12", "3"); testChange("0", "13"); testChange("1", "23"); testChange("99", "32"); testChange("100", "23"); testChange("23", "0"); testChange("43", "1"); testChange("34", "99"); testChange("65", "100"); testChange("34", "56"); } public static void testChange(String price0, String payment0) { int price = 0; int payment = 0; try { price = new Integer(price0); payment = new Integer(payment0); } catch (NumberFormatException e) { System.out.println("价钱: " + price0 + ", 付款: " + payment0); System.out.println("含非整数数字字符"); System.out.println(); return; } if(price <= 0 || price >= 100) { System.out.println("价钱: " + price + ", 付款: " + payment); System.out.println("价钱不规范"); System.out.println(); return; } if (payment <= 0 || payment >= 100 || payment < price){ System.out.println("价钱: " + price + ", 付款: " + payment); System.out.println("付款价钱不规范"); System.out.println(); return; } System.out.println("价钱: " + price + ", 付款: " + payment); Map<String, Integer> change = calculateChange(price, payment); System.out.println("找零: " + change); System.out.println(); } }
import javax.swing.*; import javax.swing.border.Border; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Test3 extends JFrame { JPanel root; JCheckBox checkBox, checkBox_1, checkBox_2, checkBox_3,checkBox_4, checkBox_5,checkBox_6; JTextField textField1,textField2; ButtonGroup flightGroup,flightGroup1,flightGroup2; public Test3() { root = new JPanel(); //定义面板容器 setContentPane(root); setLayout(null);//设置面板为绝对布局 setTitle("自动售货机模拟程序"); // 定义边界,用于包裹每一行的选项 Border border = BorderFactory.createEtchedBorder(); // 创建面板来容纳每一行的选项 JPanel panel1 = new JPanel(); panel1.setLayout(null); panel1.setBorder(border); panel1.setBorder(BorderFactory.createTitledBorder("请投币") ); panel1.setBounds(10, 10, 580, 70); JPanel panel2 = new JPanel(); panel2.setLayout(null); panel2.setBorder(border); panel2.setBorder(BorderFactory.createTitledBorder("选择饮料") ); panel2.setBounds(10, 90, 580, 70); // 定义复选框组件 flightGroup = new ButtonGroup(); flightGroup1 = new ButtonGroup(); checkBox = new JCheckBox("一元"); checkBox_1 = new JCheckBox("五角"); checkBox_2 = new JCheckBox("啤酒"); checkBox_3 = new JCheckBox("橙汁"); // Add radio buttons to the ButtonGroup flightGroup.add(checkBox); flightGroup.add(checkBox_1); flightGroup1.add(checkBox_2); flightGroup1.add(checkBox_3); // 设置复选框显示位置和大小 // 航班 checkBox.setBounds(20, 25, 100, 20); checkBox_1.setBounds(220, 25, 100, 20); checkBox_2.setBounds(20, 25, 100, 20); checkBox_3.setBounds(220, 25, 100, 20); // 将复选框添加到各自的面板中 panel1.add(checkBox); panel1.add(checkBox_1); panel2.add(checkBox_2); panel2.add(checkBox_3); JButton jButton = new JButton("确定"); jButton.setBounds(50, 180, 200, 30); jButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { boolean toubi = checkBox.isSelected()||checkBox_1.isSelected(); boolean anniu = checkBox_3.isSelected()||checkBox_2.isSelected(); if(!(toubi&&anniu)) { JOptionPane.showMessageDialog(null, "选项不能为空"); }else { if(checkBox.isSelected()){ if(checkBox_2.isSelected()){ textField1.setText("啤酒"); textField2.setText("0.5元"); }else { textField1.setText("橙汁"); textField2.setText("0.5元"); } } if(checkBox_1.isSelected()){ if(checkBox_2.isSelected()){ textField1.setText("啤酒"); textField2.setText("0元"); }else { textField1.setText("橙汁"); textField2.setText("0元"); } } } } }); JButton jButton1 = new JButton("复位"); jButton1.setBounds(350, 180, 200, 30); jButton1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { flightGroup.clearSelection(); flightGroup1.clearSelection(); textField1.setText(""); textField2.setText(""); } }); // 文本框 JLabel label = new JLabel("请取饮料:"); // 设置标签的位置和大小 label.setBounds(20, 250, 100, 30); // // 输入框 textField1 = new JTextField(); textField1.setEditable(false); // 设置文本框为只读 textField1.setBounds(100, 250, 200, 30); // (x, y, width, height) JLabel label2 = new JLabel("找零:"); // 设置标签的位置和大小 label2.setBounds(320, 250, 100, 30); // // 输入框 textField2 = new JTextField(); textField2.setEditable(false); // 设置文本框为只读 textField2.setBounds(370, 250, 200, 30); // (x, y, width, height) // 将面板添加到主面板中 root.add(panel1); root.add(panel2); root.add(label); root.add(textField1); root.add(label2); root.add(textField2); root.add(jButton); root.add(jButton1); // 设置窗口风格 setDefaultCloseOperation(EXIT_ON_CLOSE); setBounds(400, 300, 640, 480); setVisible(true); } // main方法 public static void main(String args[]) { new Test3(); } }
import javax.swing.*; import javax.swing.border.Border; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Test4 extends JFrame{ JPanel root; JCheckBox checkBox, checkBox_1, checkBox_2, checkBox_3,checkBox_4, checkBox_5,checkBox_6; ButtonGroup flightGroup,flightGroup1,flightGroup2; public Test4() { root = new JPanel(); //定义面板容器 setContentPane(root); setLayout(null);//设置面板为绝对布局 setTitle("航空服务查询问题"); // 定义边界,用于包裹每一行的选项 Border border = BorderFactory.createEtchedBorder(); // 创建面板来容纳每一行的选项 JPanel panel1 = new JPanel(); panel1.setLayout(null); panel1.setBorder(border); panel1.setBorder(BorderFactory.createTitledBorder("航班") ); panel1.setBounds(10, 10, 580, 70); JPanel panel2 = new JPanel(); panel2.setLayout(null); panel2.setBorder(border); panel2.setBorder(BorderFactory.createTitledBorder("机舱") ); panel2.setBounds(10, 90, 580, 70); JPanel panel3 = new JPanel(); panel3.setLayout(null); panel3.setBorder(border); panel3.setBorder(BorderFactory.createTitledBorder("时间") ); panel3.setBounds(10, 170, 580, 70); // 定义复选框组件 flightGroup = new ButtonGroup(); flightGroup1 = new ButtonGroup(); flightGroup2 = new ButtonGroup(); checkBox = new JCheckBox("欧美"); checkBox_1 = new JCheckBox("国外非欧美"); checkBox_2 = new JCheckBox("国内"); checkBox_3 = new JCheckBox("商务舱"); checkBox_4 = new JCheckBox("经济舱"); checkBox_5 = new JCheckBox("2小时内"); checkBox_6 = new JCheckBox("2小时外"); // Add radio buttons to the ButtonGroup flightGroup.add(checkBox); flightGroup.add(checkBox_1); flightGroup.add(checkBox_2); flightGroup1.add(checkBox_3); flightGroup1.add(checkBox_4); flightGroup2.add(checkBox_5); flightGroup2.add(checkBox_6); // 设置复选框显示位置和大小 // 航班 checkBox.setBounds(20, 25, 100, 20); checkBox_1.setBounds(220, 25, 100, 20); checkBox_2.setBounds(420, 25, 100, 20); // 机舱 panel2.setBounds(10, 90, 580, 70); checkBox_3.setBounds(20, 25, 100, 20); checkBox_4.setBounds(220, 25, 100, 20); // 时间 checkBox_5.setBounds(20, 25, 100, 20); checkBox_6.setBounds(220, 25, 100, 20); // 将复选框添加到各自的面板中 panel1.add(checkBox); panel1.add(checkBox_1); panel1.add(checkBox_2); panel2.add(checkBox_3); panel2.add(checkBox_4); panel3.add(checkBox_5); panel3.add(checkBox_6); // 文本框 JLabel label = new JLabel("航空服务:"); // 设置标签的位置和大小 label.setBounds(20, 250, 100, 30); // // 输入框 JTextField textField = new JTextField(); textField.setEditable(false); // 设置文本框为只读 textField.setBounds(100, 250, 200, 30); // (x, y, width, height) JButton jButton = new JButton("查询"); jButton.setBounds(350, 250, 200, 30); jButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { boolean hangdao = checkBox.isSelected()||checkBox_1.isSelected()||checkBox_2.isSelected(); boolean jichang = checkBox_3.isSelected()||checkBox_4.isSelected(); boolean shijian = checkBox_5.isSelected()||checkBox_6.isSelected(); if(!(hangdao&&jichang&&shijian)) { JOptionPane.showMessageDialog(null, "选项不能为空"); } // 遍历单选框,检查哪个单选框被选中 else if (checkBox.isSelected()) { textField.setText("获取食物、电影服务"); } else if (checkBox_1.isSelected()) { if(checkBox_3.isSelected()){ textField.setText("获取食物、电影服务"); }else { textField.setText("获取食物服务"); } } else if (checkBox_2.isSelected()) { if(checkBox_3.isSelected()){ textField.setText("获取食物服务"); }else if (checkBox_4.isSelected()){ if (checkBox_5.isSelected()){ textField.setText("无服务"); }else if (checkBox_6.isSelected()){ textField.setText("获取食物服务"); } } } } }); // 将面板添加到主面板中 root.add(panel1); root.add(panel2); root.add(panel3); root.add(label); root.add(textField); root.add(jButton); // 设置窗口风格 setDefaultCloseOperation(EXIT_ON_CLOSE); setBounds(400, 300, 640, 480); setVisible(true); } // main方法 public static void main(String args[]) { new Test4(); } }