有书共读】java核心技术卷1--第12章
======================java核心技术卷1第12章----Swing用户界面组件==============
主要内容:
1 Swing与模型--视图--控制器设计模式
2 布局管理
3 文本输入
4 选择组件
5 菜单
6 复杂的布局管理
7 对话框与GUI排错
==============================================================================
1 Swing与模型--视图--控制器设计模式
1.1 设计模式
模型-视图--控制器设计模式是功能分布到三个独立的交互组件:模型,视图,控制器(MVC)
模型-视图--控制器设计模式并不是AWT和Swing设计中使用的唯一模式,还有:
容器和组件是“组合(composite)”模式。
带滚动条的面板是“装饰器(decorator)”模式。
布局管理器是“策略(strategy)”模式。
1.2 组件三要素:
内容,如:按钮的状态(是否按下),或者文本框的文本
外观(颜色,大小等)
行为(对事件的反应)
模型-视图-控制器(MVC)模式告诉我们如何实现这种设计,实现三个独立的类:
模型(model):存储内容。
视图(view):显示内容。
控制器(controller):处理用户输入
2 布局管理
通常,组件放置在容器中,布局管理器决定容器中的组件具体放置的位置和大小。
按钮,文本域和其他的用户界面元素都继承于Component类,组件可以放置在面板这样的容器中。
由于Container类继承于Conponent类,所以容器也可以放置在另一个容器中。
继承层次有两点显得有点混乱。首先,像JFrame这样的顶层窗口是Container的子类,
所以也是Component的子类,但却不能放在其他容器内。另外,JComponent是Container的子类,
但不直接继承Component,因此,可以将其他组件添置到JButton中(但无论如何,这些组件无法显示出来)
每个容器都有一个默认的布局管理器,但可以重新进行设置。
2.1 边框布局
边框布局管理器(border layout manager)是每个JFrame的内容窗格的默认布局管理器。
流布局管理器完全控制每个组件的放置位置,边框布局管理器则不然,它允许为每个组件选择一个放置位置。
可以选择把组件放在内部窗格的中部、北部、南部、东部或者西部
先放置边缘组建,剩余的可用控件由中间组件占据,当容器被缩放时,边缘组件的尺寸没有改变,而中部组件的大小会发生变化。
在添加组件时可以指定BorderLayout类中的CENTER、NORTH、SOUTH、EAST和WEST常量。
并非需要占有所有的位置,如果没有提供任何值,系统默认为CENTER。
与流布局不用,边框布局会扩展所有组件的尺寸以便填充满可用空间
2.2 网格布局
网格布局像电子数据表一样,按行列排列所有的组件。不过,它的每个单元大小都是一样的
3 文本输入
文本域(JTextField)和文本区(JTextArea)组件用于获取文本输入。
文本域只能接收单行文本的输入,而文本区能够接收多行文本的输入。
JPassword也只能接收单行文本的输入,但不会将输入的内容显示出来。
这三个类都继承于JTextComponent类。由于JTextComponent是一个抽象类,所以不能够构造这个类的对象
3.1 文本域
把文本域添加到窗口的常用方法是将它添加到面板或者其他容器中,这与添加按钮完全一样
Jane panel =new JPanel();
JTextField textField=new JTextField("Default input",20);
panel.add(textField);
列数只是给AWT设定首选(preferred)大小的一个提示。如果布局管理器需要缩放这个文本域,它会调整文本域的大小
如果需要在运行时重新设置列数,可以使用setColumns方法
使用setColumns方法改变了一个文本域的大小之后,需要调用包含这个文本框的容器的revalidate方法
textField.setColumns(10);
panel.revalidate();
revalidate方***重新计算容器内所有组件的大小,并且对它们重新进行布局。调用revalidate方法之后,
布局管理器会重新设置容器的大小,然后就可以看到改变尺寸后的文本域了。
revalidate方法是JComponent类中的方法。它并不是马上就改变组件大小,而是给这个组件加一个需要改变大小的标记。
这样就避免了多个组件改变大小时带来的重复计算。
但如果想重新计算一个JFrame中的所有组件,就必须调用validate方法-----JFrame没有扩展JComponent
3.2 标签和标签组件
标签是容纳文本的组件,他们没有任何的修饰(例如没有边缘),也不能响应用户输入。可以利用标签标识组件
要想用标识符标识不带标签的组件,应该:
1) 用相应的文本构造一个JLabel组件。
2) 将标签组件放置在距离需要标识的组件足够近的地方,以便用户可以知道标签所标识的组件
JLabel的构造器允许指定初始文本和图标,也可以选择内容的排列方式。可以用Swing Constants接口中常量来指定排列方式
3.3 密码域
密码域是一种特殊类型的文本域。为了避免有不良企图的人看到密码,用户输入的字符不显示出来。
每个输入的字符都有回显字符(echo character)表示,典型的回显字符是星号(*)
Swing提供了JPasswordField类来实现这样的文本域
3.4 文本域
当在程序中放置一个文本区组件时,用户可以输入多行文本,并用ENTER换行。
稳妥考虑,对文本区的参数columns设置得应该大一些
用户并不受限于输入执行的行数和列数。当输入过长时,文本会滚动
如果文本区的文本超出线束的范围,那么剩下的文本就会被裁减掉。
可以通过开启换行特性来避免裁剪过长的行
4 选择组件
4.1 复选框
复选框自动地带有标识标签。用户通过点击某个复选框来选择相应的选项,
再点击则取消选取。当复选框获得焦点时,用户也可以通过按空格键来切换选择
4.2 单选按钮
当用户选择另一项的时候,前一项就自动地取消选择。这样一组选框通常称为单选按钮组(Radio Button Group)
4.3 边框
如果在一个窗口中有多组单选按钮,就需要用可视化的形式指明哪些按钮属于同一组。
Swing提供了一组很有用的边框(borders)来解决这个问题。
有几种不同的边框可供选择,但是使用他们的步骤完全一样
1) 调用BorderFactory的静态方法创建边框。可选的分格有:
凹斜面
凸斜面
蚀刻
直线
蒙版
2) 如果愿意的话,可以给边框添加标题,具体的实现方法是将边框传递给BorderFactory.createTitledBorder
3) 确实想把一切凸显出来,可以将几种边框组合起来使用:BorderFactory.createCompoundBorder
4) 调用JComponent类中setBorder方法将结果边框添加到组件中。
4.4 组合框
如果下拉列表框被设置成可编辑,就可以像编辑文本一样编辑当前的选项内容。鉴于这个原因,这种组合被称为组合框(combo box)
它将文本域的灵活性与一组预定义的选项组合起来。JComboBox类提供了组合框的组件。
4.5 滑动条
组合框可以让用户从一组离散值中进行选择。滑动条允许进行连续值得选择
当用户滑动滑动条时,滑动条的值就会在最小值和最大值之间变化。
当值发生变化时,ChangeEvent就会发送给所有变化的***。
为了得到这些改变的通知,需要条用addChangeListener方法并且安装一个实现了ChangeListener接口的对象。
这个接口只有一个方法StateChanged。在这个方法中,可以获取滑动条的当前值
5 菜单
位于窗口顶部的菜单栏(menu bar)包括了下拉菜单的名字。点击一个名字就可以打开包含菜单项和子菜单的菜单。
当用户点击菜单项时,所有的菜单都会被关闭并且将一条消息发送给程序。
5.1 菜单创建
创建菜单栏:
JMenuBar menuBar=new JMenuBar();
将菜单栏添加到框架:
frame.setJMenuBar();
为每个菜单建立一个菜单对象:
JMenu editMenu=new JMenu("Edit");
将顶层菜单添加到菜单栏中:
menuBar.add(editMenu);
向菜单对象添加菜单项,分隔符和子菜单:
JMenuItem pasteItem=new JMenuItem("Paste");
editMenu.add(pasteItem);
editMenu.addSeparator();
JMenu optionsMenu=...;
editMenu.add(optionsMenu);
5.2 菜单项中的图标
JMenuItem类扩展了AbstractButton类。与按钮一样,菜单可以包含文本标签、图标,也可以两者都包含。
既可以利用JMenuItem(String,Icon)或者JMenuItem(Icon)构造器为菜单指定一个图标,
也可以利用JmenuItem类中的setIcon方法(继承自AbstractButton类)指定一个图标
5.3 复选框和单选按钮菜单项
复选框和单选按钮菜单项在文本旁边显示了一个复选框或一个单选按钮。
当用户选择一个菜单框时,菜单项就会自动地在选择和未选择间进行切换
5.4 弹出菜单
弹出菜单(pop-up menu)是不固定在菜单栏中随处浮动的菜单
创建一个弹出菜单和创建一个常规菜单方法类似,只是弹出菜单没有标题
当用户点击某个鼠标键时弹出菜单。这就是所谓的弹出式触发器(pop-up trigger)。
在Window或者Linux中,弹出式触发器是鼠标右键。
5.5 快捷键和加速器
可以通过在菜单项的构造器中指定一个快捷字母来为菜单项设置快捷键
快捷键会自动地显示在菜单项中,并带有一条下划线
如果有一个Action对象,就可以把快捷键作为Action.MNEMONIC_KEY的键值添加到对象中。
cutAction.putValue(Action.MENMONIC_KEY,new Integer('A'));
只能在菜单项的构造器中设定快捷键子母,而不是在菜单构造器中。如果想为菜单设置快捷键,需要调用setMnemonic方法:
JMenu helpMenu=new JMenu("helo");
helpMenu.setMnemonic('H');
可以同时按下ALT键和菜单的快捷键来实现在菜单栏中选择一个顶层菜单的操作。
可以使用快捷键从当前打开的菜单中选择一个子菜单或者菜单项。而加速器是在不打开菜单的情况下选择菜单项的快捷键。
当用户按下加速器组合键时,就会自动地选择相应的菜单项,同时激活一个动作事件,这与手动地选择这个菜单项一样。
加速器只能关联到菜单项上,不能关联到菜单上。加速器键并不实际打开菜单。它将直接地激活菜单关联的动作事件
5.6 启用和禁用菜单项
启动和禁用菜单项有两种策略。每次环境发生变化就对相关的菜单项或动作调用setEnabled。
另一种方式是在现实菜单之前禁用这些菜单栏
5.7 工具栏
工具栏是在程序中提供的快速访问常用命令的按钮栏。
工具栏的特殊之处在于可以将它随处移动。可以将它拖拽到框架的四个边框上。
工具栏只有位于采用边框布局或者任何支持North、East、South和Weat约束布局管理器的容器内才能够被拖拽。
工具栏可以完全脱离框架。这样的工具栏将包含在自己的框架中。当关闭包含工具栏的框架时,它会回到原始的框架中。
5.8 工具提示
工具栏有个缺点就是用户常常需要猜测按钮上小图标按钮的含义,为解决这个问题,用户界面设计了工具提示。
当光标停留在某个按钮上片刻时,工具提示就会被激活。
工具提示文本显示在一个有颜色的矩形里。当用户移开鼠标时,工具提示就会自动地消失
6 复杂的布局管理
6.1 网格组布局
网格足布局是所有布局管理器之母。可以将网格组布局看成是没有任何限制的网格布局。
在网格组布局中,行和列的尺寸可以改变。
可以将相邻的单元合并以适应较大的组件(很多字处理器以及HTML都利用这个功能编辑表格:一旦需要就合并相邻的单元格)。
组件不需要填充这个单元格区域,并可以指定它们在单元格内的对齐方式
使用网格组管理器进行布局的过程:
建立一个GridBagLayout的对象。不需要指定网格的行数和列数。布局管理器会根据后面所给的信息猜测出来。
将GridBagLayout对象设置成组件的布局管理器。
为每个组件建立一个GridBagConstraints对象。设置GridBagConstraints对象的域以便指出组件在网格组中的布局方案。
通过下面的调用添加组件的约束:
add(component,constraints);
GridBagConstraints对象的几个最重要的约束:
gridx、girdy、gridwidth和gridheight参数
增量域
fill和anchor参数
填充
指定gridx,gridy,gridwidth和gridheight参数的另一种方法
使用帮助类来管理网格组约束
7 对话框与GUI排错
7.1 对话框
与大多数的窗口系统一样,AWT也分为模式对话框和无模式对话框。
模式对话框是指在结束对它的处理之前,不允许用户与应用程序的其余窗口进行交互。
模式对话框主要用于在程序继续运行之前获取用户提供的信息。
无模式对话框是指允许用户同时在对话框和应用程序的其他窗口中输入信息。
使用无模式对话框的最好例子就是工具栏。工具栏可以停靠在任何地方,
并且用户可以在需要的时候,同时与应用程序窗口和工具栏进行交互。
简单信息模式对话框:
Swing有一个很容易使用的类JOptionPane,它可以弹出一个简单的对话框,而不必编写任何对话框的相关代码。
7.2 选项对话框
Swing有一套简单的对话框,用于获取用户的一些简单信息。
JOptionPane有4个用于显示这些对话框的静态方法:
showMessageDialog:显示一条消息并等待用户点击OK
showConfirmDialog:显示一条消息并等待用户确认(与OK/Cancel类似)
showOptionDialog:显示一条消息并获得用户在一组选项中的选择
showInputDialog:显示一条消息并获得用户输入的一行文本
输入对话框有一个用于接收用户输入的额外组件。它既可能是用于输入任何字符串的文本域,也可能是允许用户从中选择的组合框
每个对话框类型都有一个方法,可以用来提供自己的图标,以替代原来的图标。
可以为每个对话框类型指定一条消息,如字符串、图标、用户界面组件,或其他类型的对象
唯一底部的按钮取决于对话框类型和选项类型
使用showOptionDialog可以指定任意的选项
7.3 创建对话框
要想创建一个对话框,需要从JDialog派生一个类,具体过程:
1) 在对话框构造器中,调用超类JDialog的构造器。
2) 添加对话框的用户界面组件。
3) 添加事件处理器。
4) 设置对话框的大小。
在调用超类构造器时,需要提供拥有者框架(owner frame)、对话框标题及模式特征。
拥有者框架控制对话框的显示位置,如果将拥有者标识为null,那么对话框将由一个隐藏框架所拥有。
模式特征将指定对话框处于显示状态时,应用程序中其他窗口是否被锁住。
无模式对话框不会锁住其他窗口,而有模式对话框将锁住应用程序中的所有其他窗口(除对话框的子窗口外)。
用户经常使用的工具栏就是无模式对话框,另一方面,如果想强迫用户在继续操作之前提供一些必要的信息就应该使用模式对话框。
7.4 文件对话框
一个好的文件对话框可以显示文件和目录,可以让用户浏览文件系统。
Swing中提供了JFileChooser类,它可以显示一个文本对话框,其外观与本地应用程序中使用的文件对话框基本一样。
JFileChooser是一个模式对话框
建立文件对话框并且获取用户选择信息的步骤如下:
1 建立一个JFileChooser对象。与JDialog类的构造器不同,它不需要指定父组件。允许在多个框架中重用一个文件选择器。
2 调用setCurrentDirectory方法设置当前目录。
3 如果有一个想要作为用户选择的默认文件名,可以使用setSelectedFile方法进行指定。
4 如果允许用户在对话框中选择多个文件,需要调用setMultiSelectionEnabled方法
5 如果想让对话框仅显示某一种类型的文件,需要设置文件过滤器。
6 在默认情况下,用户在文件选择器中只能选择文件。如果希望选择目录,需要调用setFileSelectionMode方法。
参数值为:JFileChooser.FILES_ONLY(默认值),JFileChooser.DIRECTORIES_ONLY或者JFileChooser.FILES_AND_DIRECTORIES。
7 调用showOpenDialog或者showSaveDialog方法显示对话框。
8 调用getSelectedFile()或者getSelectedFiles()方法获取用户选择的一个或多个文件。
7.5 GUI排错
1 禁用"双缓冲" Swing更新窗口时减少闪烁用的策略
2 在发出事件的每一个组件中装一个***,可以得到GUI应用中生成的每一个AWT事件记录
3 让AWT机器人完成工作
主要内容:
1 Swing与模型--视图--控制器设计模式
2 布局管理
3 文本输入
4 选择组件
5 菜单
6 复杂的布局管理
7 对话框与GUI排错
==============================================================================
1 Swing与模型--视图--控制器设计模式
1.1 设计模式
模型-视图--控制器设计模式是功能分布到三个独立的交互组件:模型,视图,控制器(MVC)
模型-视图--控制器设计模式并不是AWT和Swing设计中使用的唯一模式,还有:
容器和组件是“组合(composite)”模式。
带滚动条的面板是“装饰器(decorator)”模式。
布局管理器是“策略(strategy)”模式。
1.2 组件三要素:
内容,如:按钮的状态(是否按下),或者文本框的文本
外观(颜色,大小等)
行为(对事件的反应)
模型-视图-控制器(MVC)模式告诉我们如何实现这种设计,实现三个独立的类:
模型(model):存储内容。
视图(view):显示内容。
控制器(controller):处理用户输入
2 布局管理
通常,组件放置在容器中,布局管理器决定容器中的组件具体放置的位置和大小。
按钮,文本域和其他的用户界面元素都继承于Component类,组件可以放置在面板这样的容器中。
由于Container类继承于Conponent类,所以容器也可以放置在另一个容器中。
继承层次有两点显得有点混乱。首先,像JFrame这样的顶层窗口是Container的子类,
所以也是Component的子类,但却不能放在其他容器内。另外,JComponent是Container的子类,
但不直接继承Component,因此,可以将其他组件添置到JButton中(但无论如何,这些组件无法显示出来)
每个容器都有一个默认的布局管理器,但可以重新进行设置。
2.1 边框布局
边框布局管理器(border layout manager)是每个JFrame的内容窗格的默认布局管理器。
流布局管理器完全控制每个组件的放置位置,边框布局管理器则不然,它允许为每个组件选择一个放置位置。
可以选择把组件放在内部窗格的中部、北部、南部、东部或者西部
先放置边缘组建,剩余的可用控件由中间组件占据,当容器被缩放时,边缘组件的尺寸没有改变,而中部组件的大小会发生变化。
在添加组件时可以指定BorderLayout类中的CENTER、NORTH、SOUTH、EAST和WEST常量。
并非需要占有所有的位置,如果没有提供任何值,系统默认为CENTER。
与流布局不用,边框布局会扩展所有组件的尺寸以便填充满可用空间
2.2 网格布局
网格布局像电子数据表一样,按行列排列所有的组件。不过,它的每个单元大小都是一样的
3 文本输入
文本域(JTextField)和文本区(JTextArea)组件用于获取文本输入。
文本域只能接收单行文本的输入,而文本区能够接收多行文本的输入。
JPassword也只能接收单行文本的输入,但不会将输入的内容显示出来。
这三个类都继承于JTextComponent类。由于JTextComponent是一个抽象类,所以不能够构造这个类的对象
3.1 文本域
把文本域添加到窗口的常用方法是将它添加到面板或者其他容器中,这与添加按钮完全一样
Jane panel =new JPanel();
JTextField textField=new JTextField("Default input",20);
panel.add(textField);
列数只是给AWT设定首选(preferred)大小的一个提示。如果布局管理器需要缩放这个文本域,它会调整文本域的大小
如果需要在运行时重新设置列数,可以使用setColumns方法
使用setColumns方法改变了一个文本域的大小之后,需要调用包含这个文本框的容器的revalidate方法
textField.setColumns(10);
panel.revalidate();
revalidate方***重新计算容器内所有组件的大小,并且对它们重新进行布局。调用revalidate方法之后,
布局管理器会重新设置容器的大小,然后就可以看到改变尺寸后的文本域了。
revalidate方法是JComponent类中的方法。它并不是马上就改变组件大小,而是给这个组件加一个需要改变大小的标记。
这样就避免了多个组件改变大小时带来的重复计算。
但如果想重新计算一个JFrame中的所有组件,就必须调用validate方法-----JFrame没有扩展JComponent
3.2 标签和标签组件
标签是容纳文本的组件,他们没有任何的修饰(例如没有边缘),也不能响应用户输入。可以利用标签标识组件
要想用标识符标识不带标签的组件,应该:
1) 用相应的文本构造一个JLabel组件。
2) 将标签组件放置在距离需要标识的组件足够近的地方,以便用户可以知道标签所标识的组件
JLabel的构造器允许指定初始文本和图标,也可以选择内容的排列方式。可以用Swing Constants接口中常量来指定排列方式
3.3 密码域
密码域是一种特殊类型的文本域。为了避免有不良企图的人看到密码,用户输入的字符不显示出来。
每个输入的字符都有回显字符(echo character)表示,典型的回显字符是星号(*)
Swing提供了JPasswordField类来实现这样的文本域
3.4 文本域
当在程序中放置一个文本区组件时,用户可以输入多行文本,并用ENTER换行。
稳妥考虑,对文本区的参数columns设置得应该大一些
用户并不受限于输入执行的行数和列数。当输入过长时,文本会滚动
如果文本区的文本超出线束的范围,那么剩下的文本就会被裁减掉。
可以通过开启换行特性来避免裁剪过长的行
4 选择组件
4.1 复选框
复选框自动地带有标识标签。用户通过点击某个复选框来选择相应的选项,
再点击则取消选取。当复选框获得焦点时,用户也可以通过按空格键来切换选择
4.2 单选按钮
当用户选择另一项的时候,前一项就自动地取消选择。这样一组选框通常称为单选按钮组(Radio Button Group)
4.3 边框
如果在一个窗口中有多组单选按钮,就需要用可视化的形式指明哪些按钮属于同一组。
Swing提供了一组很有用的边框(borders)来解决这个问题。
有几种不同的边框可供选择,但是使用他们的步骤完全一样
1) 调用BorderFactory的静态方法创建边框。可选的分格有:
凹斜面
凸斜面
蚀刻
直线
蒙版
2) 如果愿意的话,可以给边框添加标题,具体的实现方法是将边框传递给BorderFactory.createTitledBorder
3) 确实想把一切凸显出来,可以将几种边框组合起来使用:BorderFactory.createCompoundBorder
4) 调用JComponent类中setBorder方法将结果边框添加到组件中。
4.4 组合框
如果下拉列表框被设置成可编辑,就可以像编辑文本一样编辑当前的选项内容。鉴于这个原因,这种组合被称为组合框(combo box)
它将文本域的灵活性与一组预定义的选项组合起来。JComboBox类提供了组合框的组件。
4.5 滑动条
组合框可以让用户从一组离散值中进行选择。滑动条允许进行连续值得选择
当用户滑动滑动条时,滑动条的值就会在最小值和最大值之间变化。
当值发生变化时,ChangeEvent就会发送给所有变化的***。
为了得到这些改变的通知,需要条用addChangeListener方法并且安装一个实现了ChangeListener接口的对象。
这个接口只有一个方法StateChanged。在这个方法中,可以获取滑动条的当前值
5 菜单
位于窗口顶部的菜单栏(menu bar)包括了下拉菜单的名字。点击一个名字就可以打开包含菜单项和子菜单的菜单。
当用户点击菜单项时,所有的菜单都会被关闭并且将一条消息发送给程序。
5.1 菜单创建
创建菜单栏:
JMenuBar menuBar=new JMenuBar();
将菜单栏添加到框架:
frame.setJMenuBar();
为每个菜单建立一个菜单对象:
JMenu editMenu=new JMenu("Edit");
将顶层菜单添加到菜单栏中:
menuBar.add(editMenu);
向菜单对象添加菜单项,分隔符和子菜单:
JMenuItem pasteItem=new JMenuItem("Paste");
editMenu.add(pasteItem);
editMenu.addSeparator();
JMenu optionsMenu=...;
editMenu.add(optionsMenu);
5.2 菜单项中的图标
JMenuItem类扩展了AbstractButton类。与按钮一样,菜单可以包含文本标签、图标,也可以两者都包含。
既可以利用JMenuItem(String,Icon)或者JMenuItem(Icon)构造器为菜单指定一个图标,
也可以利用JmenuItem类中的setIcon方法(继承自AbstractButton类)指定一个图标
5.3 复选框和单选按钮菜单项
复选框和单选按钮菜单项在文本旁边显示了一个复选框或一个单选按钮。
当用户选择一个菜单框时,菜单项就会自动地在选择和未选择间进行切换
5.4 弹出菜单
弹出菜单(pop-up menu)是不固定在菜单栏中随处浮动的菜单
创建一个弹出菜单和创建一个常规菜单方法类似,只是弹出菜单没有标题
当用户点击某个鼠标键时弹出菜单。这就是所谓的弹出式触发器(pop-up trigger)。
在Window或者Linux中,弹出式触发器是鼠标右键。
5.5 快捷键和加速器
可以通过在菜单项的构造器中指定一个快捷字母来为菜单项设置快捷键
快捷键会自动地显示在菜单项中,并带有一条下划线
如果有一个Action对象,就可以把快捷键作为Action.MNEMONIC_KEY的键值添加到对象中。
cutAction.putValue(Action.MENMONIC_KEY,new Integer('A'));
只能在菜单项的构造器中设定快捷键子母,而不是在菜单构造器中。如果想为菜单设置快捷键,需要调用setMnemonic方法:
JMenu helpMenu=new JMenu("helo");
helpMenu.setMnemonic('H');
可以同时按下ALT键和菜单的快捷键来实现在菜单栏中选择一个顶层菜单的操作。
可以使用快捷键从当前打开的菜单中选择一个子菜单或者菜单项。而加速器是在不打开菜单的情况下选择菜单项的快捷键。
当用户按下加速器组合键时,就会自动地选择相应的菜单项,同时激活一个动作事件,这与手动地选择这个菜单项一样。
加速器只能关联到菜单项上,不能关联到菜单上。加速器键并不实际打开菜单。它将直接地激活菜单关联的动作事件
5.6 启用和禁用菜单项
启动和禁用菜单项有两种策略。每次环境发生变化就对相关的菜单项或动作调用setEnabled。
另一种方式是在现实菜单之前禁用这些菜单栏
5.7 工具栏
工具栏是在程序中提供的快速访问常用命令的按钮栏。
工具栏的特殊之处在于可以将它随处移动。可以将它拖拽到框架的四个边框上。
工具栏只有位于采用边框布局或者任何支持North、East、South和Weat约束布局管理器的容器内才能够被拖拽。
工具栏可以完全脱离框架。这样的工具栏将包含在自己的框架中。当关闭包含工具栏的框架时,它会回到原始的框架中。
5.8 工具提示
工具栏有个缺点就是用户常常需要猜测按钮上小图标按钮的含义,为解决这个问题,用户界面设计了工具提示。
当光标停留在某个按钮上片刻时,工具提示就会被激活。
工具提示文本显示在一个有颜色的矩形里。当用户移开鼠标时,工具提示就会自动地消失
6 复杂的布局管理
6.1 网格组布局
网格足布局是所有布局管理器之母。可以将网格组布局看成是没有任何限制的网格布局。
在网格组布局中,行和列的尺寸可以改变。
可以将相邻的单元合并以适应较大的组件(很多字处理器以及HTML都利用这个功能编辑表格:一旦需要就合并相邻的单元格)。
组件不需要填充这个单元格区域,并可以指定它们在单元格内的对齐方式
使用网格组管理器进行布局的过程:
建立一个GridBagLayout的对象。不需要指定网格的行数和列数。布局管理器会根据后面所给的信息猜测出来。
将GridBagLayout对象设置成组件的布局管理器。
为每个组件建立一个GridBagConstraints对象。设置GridBagConstraints对象的域以便指出组件在网格组中的布局方案。
通过下面的调用添加组件的约束:
add(component,constraints);
GridBagConstraints对象的几个最重要的约束:
gridx、girdy、gridwidth和gridheight参数
增量域
fill和anchor参数
填充
指定gridx,gridy,gridwidth和gridheight参数的另一种方法
使用帮助类来管理网格组约束
7 对话框与GUI排错
7.1 对话框
与大多数的窗口系统一样,AWT也分为模式对话框和无模式对话框。
模式对话框是指在结束对它的处理之前,不允许用户与应用程序的其余窗口进行交互。
模式对话框主要用于在程序继续运行之前获取用户提供的信息。
无模式对话框是指允许用户同时在对话框和应用程序的其他窗口中输入信息。
使用无模式对话框的最好例子就是工具栏。工具栏可以停靠在任何地方,
并且用户可以在需要的时候,同时与应用程序窗口和工具栏进行交互。
简单信息模式对话框:
Swing有一个很容易使用的类JOptionPane,它可以弹出一个简单的对话框,而不必编写任何对话框的相关代码。
7.2 选项对话框
Swing有一套简单的对话框,用于获取用户的一些简单信息。
JOptionPane有4个用于显示这些对话框的静态方法:
showMessageDialog:显示一条消息并等待用户点击OK
showConfirmDialog:显示一条消息并等待用户确认(与OK/Cancel类似)
showOptionDialog:显示一条消息并获得用户在一组选项中的选择
showInputDialog:显示一条消息并获得用户输入的一行文本
输入对话框有一个用于接收用户输入的额外组件。它既可能是用于输入任何字符串的文本域,也可能是允许用户从中选择的组合框
每个对话框类型都有一个方法,可以用来提供自己的图标,以替代原来的图标。
可以为每个对话框类型指定一条消息,如字符串、图标、用户界面组件,或其他类型的对象
唯一底部的按钮取决于对话框类型和选项类型
使用showOptionDialog可以指定任意的选项
7.3 创建对话框
要想创建一个对话框,需要从JDialog派生一个类,具体过程:
1) 在对话框构造器中,调用超类JDialog的构造器。
2) 添加对话框的用户界面组件。
3) 添加事件处理器。
4) 设置对话框的大小。
在调用超类构造器时,需要提供拥有者框架(owner frame)、对话框标题及模式特征。
拥有者框架控制对话框的显示位置,如果将拥有者标识为null,那么对话框将由一个隐藏框架所拥有。
模式特征将指定对话框处于显示状态时,应用程序中其他窗口是否被锁住。
无模式对话框不会锁住其他窗口,而有模式对话框将锁住应用程序中的所有其他窗口(除对话框的子窗口外)。
用户经常使用的工具栏就是无模式对话框,另一方面,如果想强迫用户在继续操作之前提供一些必要的信息就应该使用模式对话框。
7.4 文件对话框
一个好的文件对话框可以显示文件和目录,可以让用户浏览文件系统。
Swing中提供了JFileChooser类,它可以显示一个文本对话框,其外观与本地应用程序中使用的文件对话框基本一样。
JFileChooser是一个模式对话框
建立文件对话框并且获取用户选择信息的步骤如下:
1 建立一个JFileChooser对象。与JDialog类的构造器不同,它不需要指定父组件。允许在多个框架中重用一个文件选择器。
2 调用setCurrentDirectory方法设置当前目录。
3 如果有一个想要作为用户选择的默认文件名,可以使用setSelectedFile方法进行指定。
4 如果允许用户在对话框中选择多个文件,需要调用setMultiSelectionEnabled方法
5 如果想让对话框仅显示某一种类型的文件,需要设置文件过滤器。
6 在默认情况下,用户在文件选择器中只能选择文件。如果希望选择目录,需要调用setFileSelectionMode方法。
参数值为:JFileChooser.FILES_ONLY(默认值),JFileChooser.DIRECTORIES_ONLY或者JFileChooser.FILES_AND_DIRECTORIES。
7 调用showOpenDialog或者showSaveDialog方法显示对话框。
8 调用getSelectedFile()或者getSelectedFiles()方法获取用户选择的一个或多个文件。
7.5 GUI排错
1 禁用"双缓冲" Swing更新窗口时减少闪烁用的策略
2 在发出事件的每一个组件中装一个***,可以得到GUI应用中生成的每一个AWT事件记录
3 让AWT机器人完成工作