
2.5 几个简单Swing GUI组件的设计
JDK的类库为Java GUI程序的开发提供了十分丰富的类,可以满足开发任何图形用户界面程序的需要。这些类都组织在javax.swing包及其子包中,访问Java SE的API规范网站,可以找到这些包及其类和接口的说明文档(见图1.11)。阅读API文档是学习Java程序设计的重要途径,API文档也是编写Java程序的重要工具。
NetBeans IDE的“组件面板”中分类列出了常用Swing GUI组件(见图2.38),这些组件对应了Swing库中的相应类。当采用鼠标单击方式在窗体中创建一个组件时,GUI构建器就自动生成了对应类的一个对象。当在属性窗口中为选定组件设置属性值时,GUI构建器就自动生成调用组件对象相应方法的Java语句改变该属性值。尽管查看Swing包中类的API感觉每个类都比较复杂,但使用GUI构建器以可视化方法使用它们时,主要是通过设置各个组件的属性设定它们在GUI中的表现。本节简要介绍本章前面使用过的组件属性及其设置方法。

图2.38 NetBeans IDE的“组件面板”中的GUI组件
2.5.1 程序窗口
通常,Swing GUI应用程序的顶层窗口是一个帧(JFrame)对象,在本机操作系统中是以窗口的形式注册的,具有许多熟悉的操作系统窗口的特性,如最小化/最大化、改变大小、移动等。而它的修饰部件(标题栏、图标和控制按钮等)由程序所运行的底层窗口系统绘制。JFrame是主要的顶层容器之一,有复杂的内部结构(见图2.39),以后向窗口中添加的组件都置于内容面板中。
在GUI构建器的设计视图下,属性窗口中列出了所选窗体(例如UserLogin)的属性,包括4个方面:defaultCloseOperation、title、其他属性和辅助功能。通过设置这些属性,可以配置窗口的外观和一些行为。
1. defaultCloseOperation属性
此属性设置程序运行时单击窗口的“关闭”按钮时的行为。单击属性窗口中该属性右边的下三角按钮,出现4种选项(见图2.40)。选择HIDE则设置单击该窗口的“关闭”按钮时,窗口隐藏起来;EXIT_ON_CLOSE则设置关闭窗口且程序退出运行;DO_NOTHING则设置程序无响应动作;DISPOSE则设置销毁窗口。默认设置为EXIT_ON_CLOSE。
2. title
此属性设置窗口的标题栏文字。在属性值列(title的右侧列)直接输入文字即可。单击该属性右侧的按钮,出现title设置对话框,可以对该属性进行复杂设置。
3. 其他属性
还有三十多个其他属性允许从多个方面配置窗体的细节,IDE创建窗体之后对这些属性按照平台的一般惯例做了默认设置(见图2.41),但仍然需要根据程序的运行需求进行配置。以下结合简单加法计算器程序窗体的设计,简要介绍其中常用属性的配置。

图2.39 JFrame内部结构

图2.40 defaultCloseOperation属性选项

图2.41 窗体其他属性的默认配置
1)locationByPlatform
窗体自动创建后运行程序,该窗口出现在屏幕左上角(窗口左上角坐标为(0,0)),这在大多数情况下都不符合用户的期望。设置窗体的locationByPlatform属性为选择状态(复选框打勾),则运行时该窗口出现位置由视窗系统根据最后一个窗口的位置自动定位。
2)type
该属性设置窗口的类型,通过选择下拉列表项指定。有三种类型:NORMAL是默认值,这种窗口是一个普通窗口,作为程序的顶级窗口;UTILITY类型的窗口常作为工具栏或面板,使工具栏或面板可以独立窗口方式显示在界面中;POPUP类型的窗口是一个弹出式窗口,通常作为临时出现的一个下拉式菜单或工具提示框。
3)alwaysOnTop
单击该属性值列,设置其值为True(复选框被选中,方框内出现“√”),则该窗口未关闭之前一直显示在屏幕顶层,即使切换其他程序在前台运行,该窗口也不会被遮挡。
4)bounds
该属性设置窗口的初始位置和大小。单击该属性右侧的按钮,出现bounds对话框(见图2.42),在X和Y右侧的文本框中输入整数值指定窗口左上角的坐标,在“宽度”和“高度”右侧的文本框中输入整数值指定窗口的大小。

图2.42 设置bounds属性值
5)preferredSize
该属性设置窗口最适合的大小,通常是恰好能够容纳窗口中所有组件的大小。
6)resizable
该属性设置为未选择状态(值列方框内无“√”),则用户不能改变窗口大小,“最大化”按钮失效。
7)background
该属性设置窗口的背景颜色。单击该属性行右侧的按钮,出现background对话框(见图2.43)。可以用多种方式指定颜色,其中,HSV、HSL、RGB和CMYK选项卡允许使用调色板设置窗口的背景颜色(见图2.44),“AWT组件面板”、“Swing组件面板”和“系统组件面板”选项卡允许选择预定义的配色方案设置窗口背景颜色(见图2.45)。

图2.43 背景设置对话框

图2.44 使用调色板设置背景颜色

图2.45 使用系统预定义配色方案设置背景颜色
2.5.2 标签组件的属性
标签(JLabel)组件用于描述其他组件,可以显示纯文本、图片或者二者都有,包括主要属性、其他属性、布局和辅助功能4个方面,共几十个具体属性。以下介绍主要常用属性。
1. text
text属性设置该标签显示的文字。双击该组件,标签上原来的文字被选中,并出现插入点,直接输入新文字内容即可。
2. font
font属性设置该标签显示文字的字体。选择该组件后,在“属性”窗口的font属性值列(及第2列)单击,出现font对话框(见图2.46),选择所需的字体、字体样式和大小,单击“确定”按钮即可。

图2.46 字体设置对话框
3. icon
icon属性设置该标签上显示的图标,并与文字同时显示出来。选择组件后,在“属性”窗口的此属性右侧的…按钮上单击,出现icon对话框(见图2.47),单击“外部图像”下的“文件或URL”右边的…按钮,然后在出现的“选择图像文件”对话框中选择需要的图像文件,单击“打开”按钮和“确定”按钮之后,该图像即显示在标签上文字的左边。

图2.47 icon对话框
4. horizontalAlignment
horizontalAlignment属性设置标签中文字在标签空间的水平对齐方式。选择该组件后,单击属性窗口该属性右侧的下三角按钮,出现选择列表(见图2.48)。其中,LEADING是首端对齐、TRAILING是尾端对齐、LEFT是左对齐、RIGHT是右对齐、CENTER是居中对齐。

图2.48 标签水平对齐方式选择
5. iconTextGap
如果text属性和icon属性都设置,该属性指定它们之间的间距。
6. displayedMnemonic和labelFor
displayedMnemonic属性设置标签的访问键,labelFor属性设置该标签附着的组件。当用户按下Alt+访问键时,焦点转移到labelFor属性指定的组件。例如,我们设置UserLogin窗体中jLabel1的访问键是“T”(输入字母“T”或其ASCII码“84”),指定labelFor为文本字段jTextField2,则UserLogin运行时用户按下Alt+T组合键,则焦点转移到文本字段jTextField2。
此外,背景和前景颜色也是常用属性,设置方法与JFrame的背景色设置方法相同。
2.5.3 文本字段的属性
文本字段JTextField(也称文本框)是Swing中的基本文本组件,允许用户在该组件显示的文本框中输入、删除、选中和移动文字。以下介绍该组件主要的常用属性。
1. text
指定运行时该组件中的初始文字。如果初始为空白文本框,需要将该属性值设置为空白,即属性值列无文字内容。
2. columns
指定该组件预设的显示列数,是一个整数值。例如,在UserLogin窗体的jTextField1的columns属性值列中输入20,则jTextField1的宽度调整为能够显示20个字符。
3. editable
设置该文本字段是否可以编辑。如果选取该属性(右侧复选框出现“√”,其值为True),则运行时可以编辑该文本框中的内容,否则该文本框中的内容不可编辑。
4. caretColor
设置运行时该文本框中插入点的颜色。插入点是在文本框中闪动的一条竖线,将要输入或编辑的字符在该竖线的右边(也可以删除左边文字)。设置方法与修改背景颜色相同。
5. caretPosition
设置运行时该文本框中插入点的初始位置,是一个整数值。一般默认为该文本框中字符的个数,表示插入点在最后一个字符后面,新输入的内容紧接在原字符串末尾。设置为0表示新输入的内容位于文本框的头端。
6. margin
设置文字区域和文本框的边框之间的空距。单击该属性右侧的…按钮,出现margin对话框(见图2.49),在其中输入合适的整数值即可。

图2.49 margin对话框
7. selectedTextColor和selectionColor
运行时,用户可以用鼠标或键盘选取文本框中的部分或全部文字。selectedTextColor属性设置运行时在该文本框中选取的文本的颜色,selectionColor设置所选文本的背景颜色。
此外,前景颜色、背景颜色、字体和水平对齐方式等属性设置方法与标签JLabel相同。
2.5.4 按钮的设计
Swing中的基本动作组件是按钮(JButton),与许多窗口中都能看到的“确定”和“取消”按钮一样,在单击它们之后,会触发事件。按钮JButton是最常见的事件源,鼠标单击按钮组件,一般立即引起特定指令的执行。
单击“组件面板”中的“按钮”组件,然后在窗体中单击,即可创建一个按钮。按住Shift键连续单击可以创建多个按钮。
1. 定制代码
可以定制GUI构建器自动生成的代码风格。NetBeans IDE属性窗口中的“代码”选项卡中提供了定制代码的入口(见图2.50)。
在“变量名称”行的右侧列单击,输入新的变量名称,可以更改自动生成的该组件的变量名。如将新创建按钮的变量名称“jButton1”修改为“jButtonOK”。
2. 属性设置
按钮组件的text、foreground、background、font、icon、mnemonic、horizontalAlignment、selected、margin和设置大小等属性,大多数与标签等组件含义及设置方法相同。下面再介绍一些属性,这些属性在其他组件中也有并具有相同或相似的含义。

图2.50 属性窗口的“代码”选项卡
1)toolTipText
该属性设置组件的工具提示文字。当光标悬停到(光标移动到组件上稍停留一会儿)按钮等组件上时,光标下边出现黄色小方框,方框内显示的是此属性设置的文字。
2)border
该属性设置组件的边框样式。在该属性的右侧列中单击,出现border对话框(见图2.51)。在“可用边框”列表中选择边框的类型,在下方的“属性”面板中可以设置边框各部分的颜色等属性。

图2.51 border对话框
3)cursor
该属性设置光标移动到该组件上时的类型和样式。在该属性值列单击,从下拉列表中选择适合的光标类型(见图2.52)。

图2.52 光标选择列表
4)enabled
该属性设置组件是否在当前状态下有效。如果设置按钮的enabled属性值为False(框内无√),则该按钮不会响应用户操作,且按钮以较暗的灰色显示。
5)focusable
该属性设置组件是否可以获得焦点。一般GUI程序运行时,可以按Tab键使焦点在各个组件之间依次转移。如果设置按钮的focusable属性值为False(框内无√),则该按钮不能通过Tab键获得焦点。
3.“口令”字段JPasswordField
“口令”字段JPasswordField组件也是提供单行文本输入的GUI组件,但是在其中输入的字符不会以明文显示,而是显示为替代字符,它的echoChar属性设置输入内容的显示字符(即替代字符),其他属性与文本字段相同。
2.5.5 单选按钮及按钮组
单选按钮JRadioButton是Swing的一种选择组件,多个单选按钮通常组合在一起,向用户呈现带有必选答案的问题,而且这些答案具有强制性(这意味着问题只能有一个答案)。一旦选择了单选按钮就不能取消对它的选择,除非选择了在同一组中的另外一个单选按钮。实现将多个单选按钮组合为一组的组件是按钮组ButtonGroup组件。同一个按钮组的单选按钮其中一个被选择时,另外一个就自动取消选择。
1. 单选按钮JRadioButton的属性
单选按钮JRadioButton也有几十个属性,其中设置背景颜色、前景(文字)颜色、字体以及文字对齐方式等与标签和文本字段基本相同。下面介绍几个主要属性。
1)text
该属性设置单选按钮的显示文字,设置方法与前述相同。这个属性的文字出现在圆形按钮的右侧(如)。
2)selected
设置该单选按钮初始是否为选取状态。若设置该属性右侧为选取(√),则其初始即为选取状态(),否则初始为未选取状态(
)。其值在设计视图中也可以反映出来。
3)icon
该属性设置将单选按钮的圆形图标改变为所设置的图像。与标签JLabel的icon属性设置方法相同。
4)pressedIcon
设置了该属性,则在该单选按钮上按下鼠标左键时,按钮的圆形图标变为所设置的图像。松开鼠标左键时恢复原样。
5)rolloverIcon
设置了该属性,则在选择其他单选按钮之后光标再移回到该按钮上时,按钮的圆形图标变为所设置的图像。光标移出该按钮的区域时按钮图标恢复原样。
6)selectedIcon
设置该属性则在选择这个单选按钮之后,按钮的圆形图标变为所设置的图像。选择其他单选按钮时(此时已取消了对该按钮的选择),该按钮图标恢复原样。
7)rolloverSelectedIcon
设置该属性则在这个单选按钮处于选择状态时,光标移到它的区域范围时,按钮的圆形图标变为所设置的图像。该按钮未被选择或光标移出该按钮的区域,则图标恢复原样。
8)buttonGroup
该属性设置此按钮所属的按钮组。单击属性值列,在下拉列表中选择,下拉列表项是目前在窗体中已经创建的所有按钮组变量名。同一个容器中具有相同buttonGroup属性值的单选按钮归为同一组。
2. 按钮组ButtonGroup组件
单击“组件面板”中“Swing控件”组中的“按钮组”组件,然后单击GUI构建器设计区域中的任意位置,即可将按钮组组件添加到窗体中。但应注意,所创建的按钮组组件本身不会显示在窗体中,而是显示在导航器中该窗体的“其他组件”节点下。
按钮组ButtonGroup只有4个属性,都是不可设置的,其中,buttonCount的属性值是该按钮组中按钮的个数,且是自动计算的。按钮组组件的方法getElements()在编程中比较常用,能够获得ButtonGroup中的全部组件,允许对它们进行迭代,找到其中选取的那个。
此外,多个复选框JCheckBox也可以组成按钮组。归组方法与单选按钮的相似。
2.5.6 应用示例
例2.6设计的UserLogin程序运行界面如图2.53所示,显然不像一般程序的登录界面。使用本节介绍的各个相关组件的设计方法,通过对有关属性的设置,可以把它调整成一个较为漂亮的登录界面。
例2.7 继续设计例2.6完成的用户登录程序界面,修改各个组件的有关属性,使它具有普通登录界面的外观。
操作步骤:
1. 设置窗口属性
(1)在设计视图单击UserLogin窗体,在属性窗口的title属性值列单击,输入文字“用户登录”,按Enter键。
(2)在alwaysOnTop属性值列单击,设置该属性为选取状态(复选方框中打勾)。

图2.53 例2.6设计的UserLogin程序运行界面
(3)在resizable属性值列单击,设置该属性为未选取状态(复选方框中不打勾)。
(4)单击location属性值列右侧的…按钮,在X文本框中输入400,Y文本框中输入300,单击“确定”按钮。
2. 设置标签组件属性
(1)单击jLabel1标签组件,在属性窗口中单击text属性值列,输入文字“欢迎使用用户登录程序”。
(2)单击font属性值列,在font对话框中选择“微软雅黑”字体、“普通”字体样式、大小选择24,单击“确定”按钮。
(3)单击foreground属性值列,在foreground对话框中单击RGB标签,在调色板绿色区单击选择某种绿色颜色(见图2.54),单击“确定”按钮。

图2.54 在颜色对话框中选择RGB中的某种绿色
(4)重复步骤(1),分别选择jLabel2、jLabel3和jLabel4标签组件,设置它们的text属性值分别为“用户名”“密码”和“登录为:”文字。
(5)按住Ctrl键同时选择jLabel2、jLabel3和jLabel4标签组件,重复步骤(3),选择“样本”选项卡的第5行第7列颜色,设置它们的文字颜色为蓝色。
3. 设置文本字段组件的属性
(1)选择文本字段jTextField1组件,清空text属性值列内容,在属性窗口的columns属性值列中输入20。
(2)单击caret属性值列右侧的…按钮,选择RGB选项卡调色板左下角颜色(红色为255,绿色和蓝色都为0),确定。
(3)单击selectionColor属性值列右侧的…按钮,选择“AWT组件面板”选项卡颜色选择列表中的青色,确定。
(4)选择文本字段jTextField2组件,按Delete键删除。
(5)单击“组件面板”中“Swing控件组”中的“口令”字段图标,光标移到设计区域“密码”标签右边、用户名文本字段正下方,当帮助栏提示“与另一个组件左边对齐,基线与另一个组件对齐”时单击。
(6)单击jPasswordField1组件,删除text属性值,设置columns属性值为20。
4. 设置单选按钮属性
(1)单击“组件面板”中“Swing控件组”中的按钮组图标,光标移到设计区域单击,GUI构建器会创建名为buttonGroup1的组件。
(2)单击选择jRadioButton1组件,设置text属性值为“学生”,selected属性值列复选框为选取状态,设置buttonGroup属性值为buttonGroup1。
(3)重复步骤(2)两次,分别设置jRadioButton3和jRadioButton2组件的text属性值为“教师”和“管理员”,设置buttonGroup属性值均为buttonGroup1。
5. 创建和设置两个按钮
(1)在项目窗口右键单击项目名chap02下的“源包”节点,在快捷菜单中选择“新建”|“文件夹”菜单项,文件夹名称输入images,将提前准备好的两个图标文件ok.JPG()和cancel.JPG(
)复制到该文件夹下。
(2)单击“组件面板”中“Swing控件组”中的按钮图标,光标移到窗体中与“学生”单选按钮左边对齐时单击。
(3)设置按钮jButton1的text属性值为“登录”。单击icon属性值列右侧的…按钮,在图标选择器对话框中选择“项目内的图像”|“包:images”|“文件:ok.JPG”(见图2.55),单击“确定”按钮。

图2.55 按钮的图标选择器
(4)重复步骤(2)和(3),在与“登录”按钮基线对齐、与“管理员”单选按钮右边对齐位置创建按钮组件。text属性值设置为“取消”。单击icon属性值列,在下拉列表中选择cancel.JPG(见图2.56)。

图2.56 “取消”按钮icon属性值列表
6. 修改变量名称
(1)选择“用户名”标签右侧的文本字段组件,在属性窗口中单击“代码”标签,修改“变量名称”属性值列内容为jTextFieldUserName。
(2)重复步骤(1),分别修改“密码”标签右侧的“口令”字段组件的变量名称为jPasswordFieldPassword、“学生”单选按钮组件的变量名称为jRadioButtonStd、“教师”单选按钮组件的变量名称为jRadioButtonTch、“管理员”单选按钮组件的变量名称为jRadioButtonAdmin、“登录”按钮组件的变量名称为jButtonOK、“取消”按钮组件的变量名称为jButtonCancel。
7. 移动调整组件位置
(1)按住Ctrl键,依次单击选择除第一行标签之外的所有组件,然后按下鼠标左键并移动鼠标,直到被选组件移到窗体中间适当位置(见图2.57),最后松开鼠标键。
(2)选取第一行的欢迎标签,鼠标拖动左右方向移动到窗口中间位置。

图2.57 成组移动组件位置

图2.58 登录程序运行窗口
完成以上操作步骤后即完成了登录程序GUI界面的设计。程序运行窗口如图2.58所示,可以看到窗口下半部分的组件布局仍不协调,留到后面布局设计部分再调整。