JIANGzihao0222

导航

 

     

 

实验项目名称:黑盒测试       

一、 实验目的

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();
    }
}

 

 

 

posted on 2024-04-17 00:03  实名吓我一跳  阅读(196)  评论(0编辑  收藏  举报