第5章 图形界面设计(一)
1. 图形界面设计基础(课本85-89页,领会)
AWT和Swing(见课本85-86页)
AWT:Abstract Windowing Toolkit,抽象窗口工具包
Swing:与AWT相比——功能更加强大、完善,平台相关性较小
组件和容器(见课本85-86页)
组件( Component )
组件是Java图形用户界面的最基本组成部分,是一个可以以图形化的方式显示在屏幕上、并能与用户进行交互的对象,组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。
容器( Container )
容器是可以容纳其他组件的组件,是图形界面的复合元素。
Container类有 add()方法,可以向容器添加组件。
类java.awt.container的成员方法:
public Component add( component comp )
// 将组件comp添加到当前容器中
Component、Container和Graphics类是AWT库中的关键类。
事件驱动程序设计基础(见课本85-86页)
(1)事件、监视器和监视器注册
在Java里,每当某件事发生在一个GUI组件(事件源或源对象)里,会生成一个事件对象(event)并传给为处理该事件而注册的事件监视器(event listener)。
(2)实现事件处理的途征
事件处理模型的三个基本要素:
事件源(An event source)
事件对象(An event object)
事件监视器(event listener(s))
事件源(源对象)
可供用户进行交互的GUI组件
事件对象
包装相应的事件
记录事件源以及处理该事件所需要的各种信息
事件对象对应的类一般位于包java.awt.event和包javax.swing.event中
事件监视器(事件监听器)
在事件源中注册事件监视器,当有事件发生时,事件源接收事件对象,并交由相应的事件监听器处理
事件监听器对应的接口和适配器类一般位于包java.awt.event和包javax.swing.event中
(3)事件类型和监视器接口
常用的事件:动作事件(ActionEvent)、项事件(ItemEvent)、列表选择事件(ListSelectionEvent)、文档事件(DocumentEvent)
课本88页表5-1
课本88页表5-2
2. 框架窗口(课本89-91页,综合应用)
JFrame的创建
框架(类javax.swing.JFrame)的构造方法:
public JFrame( ) throws HeadlessException
// 构造一个初始时不可见的Frame
public JFrame( String title ) throws HeadlessException
//创建一个新的、初始不可见的、具有指定标题的 Frame;参数title指定标题
JFrame的常用成员方法
框架(类javax.swing.JFrame)的一系列用于属性设置的成员方法:
public void setBounds(int x, int y, int width, int height)
//移动Frame并调整其大小。由 x 和 y 指定左上角的新位置,由 width 和 height 指定新的宽度和高度。单位是像素。
public void setSize( int width, int height ) // 设置Frame的大小
public void setBackground(Color c) //设置Frame的背景色
public void setVisible( boolean b )
// 设置Frame是否可见,应当在Frame的属性设置完毕并添加完组件之后调用该方法,使初始不可见的框架变成可见的
public void setTitle(String title) //将Frame的标题设置为指定的字符串
public void setResizable(boolean resizable)
// 设置此窗体是否可由用户调整大小(默认为可调整大小)
框架(类javax.swing.JFrame)的其他常用成员方法:
public void pack() // 以紧凑方式显示Frame
public String getTitle() //获得窗体的标题
向容器中添加组件:在Swing图形用户界面程序设计中,给顶层容器添加组件的方法一般是先获取顶层容器的内容窗格,再向内容窗格添加组件。
类javax.swing.Frame的成员方法:
public Container getContentPane( ) // 返回当前Frame的内容窗格
类java.awt.container的成员方法:
public Component add( component comp ) // 将组件comp添加到当前容器中
对于顶层容器,是向其内容窗格添加组件;对于其他容器,则可直接添加组件。
为顶层容器添加组件的另一种方法:建立JPanel对象作为中间容器,将组件添加到这个容器中,再用方法public void setContentPane(Container contentPane)把此中间容器设置为内容面板。
JPanel contentPane = new JPanel(); … // 添加组件到contentPane中
mw = setContentPane(contentPane); // mw为之前创建的某JFame对象
3. 标签、按钮和按钮事件 (课本91-94页,综合应用)
标签(见课本91-92页)
标签(javax.swing.JLabel)是用于短文本字符串或图像或二者的显示区。标签不对输入事件作出反应。
标签(类javax.swing.JLabel)的构造方法:
public JLabel( )
public JLabel( String text )
public JLabel( String text, int align )
// 参数text指定标签的文字信息;参数align指定文字在水平方向上的对齐方式。常见对齐方式:javax.swing.JLabel.LEFT(左对齐)、javax.swing.JLabel.CENTER(中对齐)、javax.swing.JLabel.RIGHT(右对齐)
JLabel的常用成员方法:
public void setText( String text ) // 设置标签的文字信息
public void getText( ) //返回该标签所显示的文本字符串
public void setBackground(Color bg) // 设置标签的背景色,默认为容器的背景色
public void setForeground(Color fg)
// 设置标签的前景色,即标签上的文字的颜色,默认为黑色
按钮(见课本92-94页):命令式按钮在界面设计中用于激发动作事件。
命令式按钮(类javax.swing.JButton)的构造方法:
public JButton ( )
public JButton ( String text)
JButton的成员方法详见课本92页。
public void addActionListener( ActionListener a )
// 为按钮注册由参数a指定的动作事件监视器
动作事件监视器一般是实现接口java.awt.event.ActionListener的类的实例对象。
接口java.awt.event.ActionListener的定义如下:
public interface ActionListener extends EventListener {
public void actionPerformed( ActionEvent e );
}
动作事件对象
动作事件对象的具体类型为java.awt.event.ActionEvent。
类java.awt.event.ActionEvent的常用成员方法包括:
public Object getSource( ) // 返回当前事件的事件源
public String getActionCommand( ) // 返回当前动作事件相关的字符串
类JButton中定义了成员方法:
public void setActionCommand(String actionCommand)
//设置此按钮的动作命令
按钮(动作事件)处理程序的基本内容包括:
定义一个类,实现接口ActionListener,即在此类中实现actionPerformed()方法
4. 面板(课本94-96页)
JPanel(见课本94-95页)面板是一种常用容器,常被用作中间容器。
面板(类javax.swing.JPanel)的构造方法:
public JPanel ( )
public JPanel(LayoutManager layout) //创建具有指定布局管理器的JPanel
使用JPanel的两种途径:
(1) 直接创建JPanel的实例对象,在其中添加组件,再将其放入另一个容器中(如JFrame)
(2)定义JPanel类的子类,在其构造方法中向其中添加组件,再通过创建这个子类的实例对象,并将这个对象加入另一个容器中
JPanel的常用成员方法:
public void setPreferredSize( Dimension preferredSize )
// 将面板大小设置为参数preferredSize所指定的尺寸
类java.awt.Dimension的构造方法:
public Dimension( int width, int height) //参数width指定宽度,参数height指定高度
public void setBackground( Color bg ) //将面板背景颜色设置为参数bg所指定的颜色
JScrollPane(见课本95-96页):带有滚动条的面板,它也是java.awt.container类的子类,但规定只能向其中添加一个组件。当一个容器的显示区域不足,导致无法同时显示其中的所有组件时,如果让容器带有滚动条,则通过移动滚动条的滑块,就可以看到所有位置上的组件。为容器添加滚动条的工作,可以通过将容器添加到一个JScrollPane中实现。
滚动窗格(javax.swing.JScrollPane)的构造方法:
public JScrollPane( )
// 可以先创建JScrollPane对象,再用其成员方法setViewportView(Component view)设置需要加上滚动条功能的组件
public JScrollPane( Component view)
// 参数view指定需要加上滚动条功能的组件,只要组件的内容超过视图大小就会显示水平和垂直滚动条
设置JScrollPane滚动条属性的成员方法:
public void setHorizontalScrollBarPolicy(int policy)
// 确定水平滚动条何时显示在滚动窗格上。选项有:
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED (水平滚动条需要时才显现)
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER (水平滚动条总是不可见)
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS (水平滚动条总是可见)
public void setVerticalScrollBarPolicy(int policy)
// 确定垂直滚动条何时显示在滚动窗格上。选项有:
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED(垂直滚动条需要时才显现)
ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER (垂直滚动条总是不可见)
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS (垂直滚动条总是可见)
5. 布局设计(课本96-102页,综合应用)
FlowLayout布局(见课本97页)
流布局管理器(java.awt.FlowLayout)是 java.awt.Applet、java.awt.Panel 和 javax.swing.JPanel的默认布局方式。特点:在容器中,从左到右依次排列组件,当组件排满一行时,则从下一行开始继续排列组件。可以设置每行组件的对齐方式为: 左对齐、中间(默认对齐方式)和右对齐。
类java.awt.FlowLayout的构造方法:
public FlowLayout( )
public FlowLayout( int align )
public FlowLayout( int align, int hgap, int vgap)
// 参数hgap(vgap)指定同一行相邻两组件之间的水平(竖直)间隙,单位为像素,默认值均为5;参数align指定行对齐方式:java.awt.FlowLayout.LEFT(左对齐)、java.awt.FlowLayout.CENTER(中对齐)、java.awt.FlowLayout.RIGHT(右对齐)
BorderLayout布局(见课本97-98页):边界布局管理器(java.awt.BorderLayout)是 java.awt.Frame、java.awt.Dialog 和 javax.swing.Window、 javax.swing.Frame、 javax.swing.Dialog的默认布局方式。特点:将容器分成东、西、南、北、中五个区域,分别对应常量:
java.awt.BorderLayout.EAST 东(右侧)
java.awt.BorderLayout.WEST 西(左侧)
java.awt.BorderLayout.SOUTH 南(底部)
java.awt.BorderLayout.NORTH 北(顶部)
java.awt.BorderLayout.CENTER 中(中间)
每个区域最多只能容纳1个组件。
类java.awt.BorderLayout的构造方法:
public BorderLayout( )
public BorderLayout( int hgap, int vgap )
// 参数hgap指定同一行相邻两组件之间的水平间距,参数vgap指定相邻两行组件之间的竖直间距,单位均为像素,默认值均为0
GridLayout布局(见课本98-99页):特点,网格布局管理器(java.awt.GridLayout)将容器按行与列等分成相同大小的矩形区域(网格);每个组件占用具有相同宽度和高度的网格;添加组件到网格的顺序: 从左到右,从上到下
类java.awt.GridLayout的构造方法:
public GridLayout( )
public GridLayout( int rows, int cols )
public GridLayout( int rows, int cols, int hgap, int vgap )
// 参数rows和col分别指定网格的行数和列数(注意实际行数和列数的计算),默认值均为1;参数hgap和vgap分别指定同一行相邻两组件之间的水平和竖直间距,单位均为像素,默认值均为0;
CardLayout布局(见课本100-101页):
特点:卡片布局管理器(java.awt.CardLayout)对组件的排列类似于码扑克牌,新加入的组件放在已加入的组件的上面,每次一般只能看到一个组件;可以从上到下依次取出下一个组件,而当前组件变为最后一个组件;可以直接翻到某个组件,而组件之间前后排列顺序保持一致。
类java.awt.cardLayout的构造方法:
public CardLayout( )
public CardLayout(int hgap, int vgap )
// 参数hgap和vgap分别指定组件与容器边界之间的水平和竖直间隙,单位均为像素,默认值均为0;
在CardLayout布局下向容器添加组件:使用类java.awt.container的成员方法:
public void add( component comp, Object contraints )
// 将组件comp添加到当前容器中,参数contraints的实际类型为String,指定组件comp的名称。新加入的组件放在已加入的组件的上面
类java.awt.CardLayout提供了成员方法:
public void show( Container parent, String name)
// 直接翻转到指定组件,但不改变组件间的前后排列顺序。参数parent指定要在其中布局的父容器;参数name指定要翻转到的组件的名称。
public void first( Container parent ) // 翻转到容器parent的第一个组件
public void last( Container parent ) // 翻转到容器parent的最后一个组件
public void next(Container parent)//翻转到容器parent中当前显示组件的后一个组件
public void previous(Container parent)
//翻转到容器parent中当前显示组件的前一个组件
Null布局与setBounds方法(见课本100-101页)
可以把一个容器的布局设置为null,即空布局。而采用组件的setBounds()方法设置其大小和在容器中的位置。
类java.awt.Component的成员方法:
public void setBounds(int x, int y, int width, int height)
// 设置组件位置及大小。由 x 和 y 指定组件的左上角在容器中的位置坐标,由 width 和 height 指定组件的宽和高。
类java.awt.Component还有成员方法:
public Dimension getSize( )
// 以 Dimension 对象的形式返回组件的大小。Dimension 对象的 height 字段包含此组件的高度,而 Dimension 对象的 width 字段则包含此组件的宽度。
布局管理器类(如FlowLayout、BorderLayout、GridLayout、CardLayout等)有成员方法:
public void setHgap(int hgap) //将组件之间的水平间距设置为指定值
public void setVgap(int vgap) //将组件之间的垂直间距设置为指定值
6. 文本框和文本区 (课本102-107页,综合应用)
文本框(见课本102-103页):文本框(javax.swing.JTextField)可用来编辑单行文本。文本框(类javax.swing.JTextField)的构造方法:
public JTextField ( )
public JTextField ( String text )
public JTextField ( int columns)
public JTextField ( String text, int columns)
// 参数text指定在文本框中显示的初始文本信息;参数columns为非负整数,指定文本框的宽度
类java.swing.JTextField
public String getText( ) // 获取文本框的文本信息
public void setText( String t ) // 设置文本框的文本信息
public void setEditable( boolean b )
// 设置文本框是否可编辑,b为true则可编辑,为false则不可编辑。
文本框(JTextField)可以触发动作事件,其类定义中含有成员方法
public void addActionListener( ActionListener a )
// 为文本框注册由参数a指定的动作事件监视器
文本区(见课本103-104页):可以编辑多行文本信息的文本区域;文本区域不能自动进行滚屏处理,可以将文本区域添加到滚动窗格(JScrollPane)中,从而实现文本区域自动添加滚动条的功能。
文本区(类javax.swing.JTextArea)的构造方法:
public JTextArea ( )
public JTextArea ( String text )
public JTextArea ( int rows, int columns )
public JTextArea ( String text, int rows, int columns )
// 参数text指定在文本区域中显示的初始文本信息;参数rows指定显示的行数;参数columns指定显示的列数
类java.swing.JTextArea的成员方法:
public String getText( ) // 获取文本区的文本信息
public void setText( String t ) // 设置文本区的文本信息
public void setLineWrap( boolean wrap )
// 设置文本区的换行策略。如果设置为 true,则当行的长度大于所分配的宽度时,将换行。如果设置为 false,则始终不换行。
实现文本区域自动添加滚动条,只需使用滚动面板(javax.swing.JScrollPane)的构造方法:
public JScrollPane( Component view) // 参数view指定需要加上滚动条功能的组件
例如:
JTextArea ta = new JTextArea( );
JScrollPane jsp = new JScrollPane(ta);
数据输入和输出(见课本104-107页)
在GUI中,常用文本框和文本区实现数据的输入和输出。例5.9、例5.10