Java语言GUI程序设计
上QQ阅读APP看书,第一时间看更新

3.4 分支结构

程序的分支结构实现分支流程。if语句是Java语言中实现分支流程的最基本语句。它根据给定的条件进行判断,以决定是否执行某个分支程序段。Java语言的if语句有三种基本形式。

3.4.1 if形式

if语句的格式如下:

     if(表达式) 语句

执行流程是:如果表达式的值为true,则执行其后的语句,否则不执行该语句(见图3.3)。

图3.3 if语句的执行流程框图

例3.1 设计一个Java GUI程序,计算并显示用户所输入的最大整数。

分析:此程序界面中首先应有输入整数的组件,使用前面学过的文本字段;显示最大整数的组件也使用一个文本字段组件,设置为不可编辑;用户可能输入多个整数,则采用可以显示多行文本的文本区域组件存放和显示,且在GUI构建器中创建的文本区域组件当文本行数超过组件大小时还会显示滚动条,它的editable属性可以设置为不能编辑;使用两个按钮分别用于确定一个整数输入的完成,以及重新开始另一组整数筛选时清除本组的所有数据。请读者根据描述手工画出界面草图。

程序算法这样考虑:在类的范围内设置一个整型变量(字段)存放筛选出来的最大整数,其初值设置为int类型包装类Integer提供的整数的最小值字段Integer.MIN_VALUE。程序运行时每当用户输入一个整数,就通过比较将该字段变量赋值为当前已经输入的整数中的最大值;同时,还应该将输入的这个整数添加到文本区域保存的整数列表中,并更新显示最大数的文本字段的内容。

解:首先设计程序的GUI,简要设计步骤如下。

(1)创建名为chap03的Java应用程序项目。注意取消“创建主类”复选框的选择。以下操作均在该项目中进行。

(2)创建新的JFrame窗体,包名输入book.ifdemos,类名输入IfMaxDemo。设置该窗体的title属性值为“最大数筛选程序”。

(3)在IfMaxDemo窗体中创建三个标签组件,text属性值分别为“输入整数:”“所有整数:”和“最大整数:”。

(4)创建两个文本字段,变量名为jTextFieldNum和jTextFieldMax,text属性值为空,columns属性值为16,jTextFieldMax组件的editable属性值为false。

(5)创建一个文本区域组件,变量名设置为jTextAreaNums,editable属性值为false,columns属性值为16。

(6)创建两个按钮组件,变量名为jButtonInput和jButtonClearAll,text属性值分别为“确定”和“清除”。

(7)IfMaxDemo窗体中组件的布局如图3.4所示。

图3.4 筛选最大数程序界面

以下步骤设计在jTextFieldMax文本字段显示用户输入数据最大数的程序。

(8)单击程序编辑窗口“源”标签,切换到源代码视图。在IfMaxDemo类体的第一行(源代码视图的第13行)添加变量声明“int maxNum=Integer.MIN_VALUE;”语句()。

(9)单击程序编辑窗口“设计”标签,切换到设计视图。单击“确定”按钮组件jButtonInput,然后单击属性窗口的“事件”标签,接着单击属性窗口actionPerformed行右侧的…按钮,在新出现的对话框中单击“添加”按钮,输入新处理程序的名称为addNumber,单击“确定”按钮,自动切换到“源”代码视图。

(10)在addNumber方法中输入如图3.5所示的语句。

图3.5 IfMaxDemo类addNumber方法中输入的Java语句段

(11)使用与步骤(9)相同的操作,为“清除”按钮设计事件处理方法clearNums。该方法源代码如下。

完成上述步骤后,运行程序,输入一些整数,看到程序按要求工作(见图3.6)。

图3.6 例3.1程序运行窗口

程序解析:

(1)用户在文本字段jTextFieldNum中输入数据时有可能无意中在数值前后输入了空格,需要用String类的trim方法去除;用户有可能没有输入数值或输入了几个空格(或其他空白字符)就单击“确定”按钮,这时程序不必计算和处理什么。因此,使用if语句“if(text!=null && !text.trim().equals("")) {…}”确保用户输入了内容(text!=null)且(&&)不是空白输入(!text.trim().equals("")),才进行计算处理({…})。

(2)在文本区域组件jTextAreaNums中从第二行起,对每个新输入行都应该在换行(”\n”)之后添加一行显示(jTextAreaNums.append("\n");)。因此,使用if语句确保文本区域已有内容(if(texts!=null && !texts.trim().equals("")))才添加换行符“TextAreaNums.append("\n");”。

(3)如果当前输入的整数大于目前记录的最大整数值(if(num>maxNum)),则将新输入的整数赋值给记录最大数的变量(maxNum = num;)。

显然,使用if语句使此程序中的一些语句有条件地执行。

3.4.2 if-else形式

Java语言if语句的第二种形式是if-else,一般格式如下:

     if(表达式)
         语句1;
     else
         语句2;

执行流程是:如果表达式的值为true,则执行语句1,否则执行语句2(见图3.7)。

图3.7 if-else语句的执行流程框图

例3.2 设计一个Java GUI程序,在用户输入一系列整数时,统计用户所输入的奇数和偶数个数。

分析:用户所输入的每个整数不是奇数就是偶数,所以程序的核心部分是二分支判断结构——if(num%2==1) //奇数个数加1;

else //偶数个数加1;

GUI与例3.1大同小异。

解:按照以下步骤操作。

(1)在项目窗口右击IfMaxDemo.java文件,在快捷菜单中选择“复制”菜单项。然后右击包名book.ifdemos,在快捷菜单中选择“粘贴”|“重构复制”菜单项,新名称输入“IfElseDemo”,单击“重构”按钮。

(2)修改窗体IfElseDemo的title为“奇数偶数个数统计程序”。

(3)修改标签“最大整数:”为“奇数个数:”,修改文本字段组件jTextFieldMax的变量名为jTextFieldOdd,设置jTextFieldOdd组件的columns值为3。

(4)添加标签“偶数个数:”,添加文本字段组件且修改变量名为jTextFieldEven,设置该文本字段组件的columns值为3。

完成上述步骤后,得到如图3.8所示GUI。

图3.8 例3.2GUI设计视图

(5)单击“确定”按钮,切换到属性窗口“事件”视图,单击actionPerformed行右侧下三角按钮,选择addNumber,编辑窗口会自动切换到“源”视图。

(6)在IfElseDemo类体中修改原“int maxNum=0;”为“int oddNum=0;”,回车后添加语句“int evenNum=0;”。

(7)修改addNumber方法体代码为:

(8)修改clearNums方法体代码为:

     jTextFieldNum.setText("");
     jTextAreaNums.setText("");
     jTextFieldOdd.setText("");
     jTextFieldEven.setText("");
     oddNum=0;
     evenNum=0;

完成上述步骤后,右键单击IfElseDemo.java文件,在快捷菜单中选择“运行文件”菜单项开始运行程序,程序可以按照题意统计奇数和偶数个数。

3.4.3 if-else-if形式

前两种形式的if语句一般都用于两个分支的情况。当出现多个分支选择的情况时,可采用if-else-if语句,其一般形式为:

     if(表达式1)
         语句1;
     else if(表达式2)
         语句2;
     else if(表达式3)
         语句3;
     …
     else if(表达式m)
         语句m;
     else
         语句n;

执行流程是:依次判断表达式的值,当出现某个值为true时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。如果所有的表达式均为false,则执行语句n。然后继续执行后续程序。if-else-if语句的执行过程如图3.9所示。

图3.9 if-else-if语句的执行流程框图

例3.3 设计一个Java GUI程序,在用户输入一些学生成绩时,统计各分数段人数。其中,成绩在90及以上为优秀、在80~89为良好、60~79为及格,0~59为不及格。要求成绩取整数值,小于0和大于100的分数为非法输入,应该过滤掉。

分析:由于需要把各个成绩归入4个合法分数段,所以进行多分支判断,核心程序段应该采用if-else-if结构。

解:在项目chap03的book.ifdemos包中创建窗体IfElseIf之后,按照以下步骤设计。

(1)设计如图3.10所示界面。其中,显示4个分数段人数的文本字段组件变量名分别为jTextFieldGe90、jTextFieldGe80、jTextFieldGe60和jTextFieldB60,其余组件命名与例3.2相同。修改窗体title属性值为“分数段频数统计程序”。

图3.10 例3.3程序的GUI设计视图

(2)在IfElseIfDemo类体中开始位置添加语句:

     int numGe90=0;
     int numGe80=0;
     int numGe60=0;
     int numB60=0;

(3)为“确定”按钮的actionPerformed事件添加addNumber方法,方法体代码为:

(4)为“清除”按钮的actionPerformed事件添加clearNums方法,方法体代码如下。

     jTextFieldNum.setText("");
     jTextAreaNums.setText("");
     jTextFieldGe90.setText("");
     jTextFieldGe80.setText("");
     jTextFieldGe60.setText("");
     jTextFieldB60.setText("");
     numGe90 = 0;
     numGe80 = 0;
     numGe60 = 0;
     numB60 = 0;

完成上述步骤后,右击IfElseIfDemo.java文件,在快捷菜单中选择“编译文件”菜单项。再次右击IfElseIfDemo.java文件,在快捷菜单中选择“运行文件”菜单项开始运行程序,程序可以按照题意工作。

3.4.4 if语句的嵌套

当if语句中的执行语句又是if语句时,则构成了if语句嵌套的情形。

其一般形式可表示如下:

     if(表达式)
         if语句;

或者为

     if(表达式)
        if语句;
     else
        if语句;

在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。

例如:

     if(表达式1)
     if(表达式2)
         语句1;
     else
         语句2;

其中的else究竟是与哪一个if配对呢?应该理解为:

     if(表达式1)
          if(表达式2)
             语句1;
          else
             语句2;

还是应理解为:

     if(表达式1)
         if(表达式2)
             语句1;
     else
         语句2;

为了避免这种二义性,Java语言规定,else总是与它前面最近的if配对,因此对上述例子应按前一种情况理解。

在Java GUI程序设计中,出现if语句嵌套的情况还是比较普遍的。例3.1和例3.2就使用了嵌套的if语句,在外层if语句确保文本框中有输入内容的前提下,在内层才利用if语句计算正负数个数,或奇偶数个数。例3.3则演示了更复杂的if语句嵌套使用,其中第二层“if(num>=0 &&num<=100) {…}”确保输入的分数是合法值,最内层的if语句则统计各个分数段人数。