1.04k likes | 1.23k Views
第 6 章 AWT/Swing 组件及事件处理. 6.1 图形用户界面概述 6.2 GUI 标准组件的使用 6.3 Java 的事件处理 6.4 窗口及菜单设计 6.5 图形界面的布局设计 6.6 建立对话框. 学习提要. 掌握常用的 GUI 标准组件及图形界面的设计方法; 掌握 JAVA 的事件处理机制和常用事件响应代码的编写方法; 掌握容器及布局、菜单、对话框的设计方法. 6.1 图形用户界面概述. 6.1.1 基本概念 ( 1 ) GUI — 图形用户界面 ( Graphics User Interface )
E N D
第6章 AWT/Swing组件及事件处理 6.1 图形用户界面概述 6.2 GUI标准组件的使用 6.3 Java的事件处理 6.4 窗口及菜单设计 6.5 图形界面的布局设计 6.6 建立对话框
学习提要 • 掌握常用的GUI标准组件及图形界面的设计方法; • 掌握JAVA的事件处理机制和常用事件响应代码的编写方法; • 掌握容器及布局、菜单、对话框的设计方法
6.1 图形用户界面概述 6.1.1 基本概念 (1) GUI—图形用户界面(Graphics User Interface) 使用图形的方式借助菜单、按钮等标准界面元素和鼠标操作,帮助用户和计算机之间进行交互。 (2)AWT——抽象窗口工具集(abstract window toolkit) Java中用来生成图形用户界面的基础类库是java.awt包,它是Java基本包中最大的一个,定义了所有GUI组件类,以及其它用于构造图形界面的类。Sun公司在JDK1.0中就提供了AWT。 为了实现跨平台特性,AWT类库中的各种操作被定义成在一个并不存在的“抽象窗口”中进行。
AWT组件的类层次 • Component 组件是所有AWT组件的基类,提供了基本的显示和事件处理特征。
(3) Swing GUI组件 • 在Java2中,javax.swing包被列入Java的基础类库JFC,其中定义的Swing GUI组件相对于java.awt包的各种GUI组件增加了许多功能。 • Swing组件类 Swing包含250多个类(有些是组件,有些是支持类,组件的名字都以 J 开头), Swing提供了40多个组件,是AWT的4倍,用轻量组件(没有本地对等组件)代替了AWT的重量组件(与本地对等组件相关联)。 除模仿AWT组件所提供的功能外,几乎所有的Swing替代组件都有其他一些特性,如Swing按钮可以显示图标和文本,AWT按钮只显示文本。
(4)设计图形界面的步骤 1)定义最外层的容器(Frame,JFrame),设定布局管理方式; 2)在外层容器中依次加入小容器(Panel等)和标准组件; 3)设计图形界面元素的物理外观(颜色,字体,对齐方式等、位置); 4)定义界面元素对不同事件(如鼠标点击等)的响应,实现界面与用户的交互功能.
6.1.2 图形用户界面元素 分三类: 容器、控制组件、用户自定义成分。 (1)容器 是用来组织其他界面成分和元素的单元,如窗体(Frame、JFrame)、面板(Panel、JPanel)等。 主要作用: 用来容纳、排列其它界面元素。 容器的特点: (1)可以容纳其他界面元素;(2)通过设置布局方式,来决定其它界面元素的排列方式。 思考:作为最外层容器的Frame和JFrame,在其中加入其它界面元素时有何区别?(理解JFrame的ContentPane)
(2)控制组件(标准界面元素) 如Label、TextField、Button等。 例:创建Button,并处理事件(ActionEvent)。 Button btn=new Button(“显示”); add(btn); btn.addActionListener(this); public void actionPerformed(ActionEvent e) { if(e.getSource()==btn) showStatus(“你按下了显示按钮!!”); } 控件组件是图形界面的最小单位,里面不能再包含其他成分。如:命令按钮、文本域、标签等。控件的作用是完成与用户的一次交互,如接受用户指令、向用户显示文本等。 使用控件的步骤: 创建组件→确定属性(颜色、字体等) →加到外层容器中→注册事件监听器→重载事件处理方法。
6.1.3 用户自定义图形界面成分 自定义成分是指: 利用Java类库中的类及其方法来绘制符合用户特定要求的图形界面成分,也可以将已经存在的图形、动画等加载到当前程序中来。 (1) 绘制图形(线段、矩形、圆、多边形、弧形) Graphics类——绘制直线、矩形、多边形、圆等。 Point类——表示一个象素点 Dimension类——表示宽和高 Rectangle类——表示一个矩形 Polygon类——表示一个多边形 Color类——表示颜色
(2) 显示文字 Java中用一个Font类的对象来表示一种字体显示效果,包括字体类型、字型和字号。 Font.PLAIN ——正常 字型常量 Font.BOLD ——加粗 Font.ITALIC ——倾斜 1) 创建字体对象 Font MyFont=new Font(“TimesRoman”,Font.BOLD,12); 2)使用字体对象 g.setFont(MyFont); //g是Graphics对象 btn.setFont(MyFont); //btn是按钮对象
(3) 控制颜色 java.awt.Color--代表颜色。可以直接使用系统定义好的颜色常量(如Color.blue),也可以通过R、G、B三色比例来创建自己的Color对象。 1) Color类的构造函数 public Color(int Red,int Green,int Blue); // 每个参数的取值范围在0-255之间。 public Color(float Red, float Green, float Blue); // 每个参数的取值范围在0-1.0之间。 public Color(int RGB); // 指明RGB三色的比例,这个参数的0-7比特代表红色的比例,8-15比特代表绿色的比例,16-23比特代表蓝色的比例。
例: • 创建自己的颜色: Color blueColor= new Color(0,0,255); g.setColor(blueColor); • 利用系统的颜色常量: g.setColor(Color.blue); 2) GUI控件的颜色设置方法 public void setBackground(Color c); //设置背景颜色 public Color getBackground(); //取得背景颜色 public void setForeground(Color c); //设置前景颜色 public Color getForeground(); //取得前景颜色
(4) 显示图象 • Java中可以利用Graphics类的drawImage()方法显示图象。drawImage()方法的格式如下: drawImage(参数1,参数2,参数3) 参数1:Image对象,可以用系统为Applet类定义的getImage()方法获得;参数2、参数3:显示时图象左上角的X、Y坐标。 • getImage(参数1,参数2 ) 参数1:图象文件所在的URL地址 参数2:图象文件的文件名 • getDocumentBase() 获取含有该Applet的HTML文件的URL地址。
例:图形用户界面—自定义成分示例 import java.awt.*; import java.applet.Applet; public class TestGraphics extends Applet { Image myImage ; Font myFont=new Font("黑体",Font.BOLD,20); Color myColor=new Color(120,25,180); public void init() { myImage = getImage(getDocumentBase(), "fys.jpg" ); }
public void paint(Graphics g) { g.drawLine(30,5,40,5); //画线 g.setColor(Color.blue); //设置字体颜色 g.drawRect(40,10,50,20); //画空长方形 g.setColor(Color.red); setBackground(Color.yellow); //设置背景颜色 g.fillRect(60,30,70,40); //画实体长方形 g.setFont(myFont); g.drawString("大家好!",100,200); g.setColor(myColor); g.drawString(g.getFont().toString(),10,250); g.drawImage(myImage, 150, 10, this ); //显示图片 } }
(5) 实现动画效果 用Java实现动画的原理与放映动画片类似,取若干相关的图象,按顺序、连续地在屏幕上先显示,后擦除,循环往复就可以获得动画的效果。 课外实践题: 编写Java Applet,实现将若干幅图片按一定的时间间隔(如1秒),交替显示. (第1幅第2幅 … 第10幅第1幅…)
6.2 常用的GUI标准组件AWT(Swing)介绍 • 标签(Label)(J Label) Label的构造函数: • Label (String):指定标签文字 • Label (String,int):指定标签文字及对齐方式 0= Label .LEFT 1= Label .RIGHT 2= Label.CENTER void setAlignment(int) :设置标签对齐方式。
文本输入框(TextField)(JTextField ) (JPasswordField 密码输入框) TextField的构造函数: TextField (int) TextField (String) TextField(String,int)指定初始文本及长度
多行文本组件(TextArea)(JTextArea) • 多行文本组件的构造函数: TextArea (int, int) //用指定的行数、列数创建 TextArea (String) //用指定的初始文本创建 TextArea (String, int , int ) //用指定的初始文本、行数、列数创建 TextArea( String,int, int, int)//用指定的初始文本、行数、列数及滚动条创建 • 事件响应与TextField相同。
按钮(Button)(JButton) 按钮的构造函数: Button(String text) //创建一个带有文本信息的按钮 如果是JButton,上面不仅可以显示文字,还可以显示图标。(Swing组件比AWT组件更生动。)
Button对事件的响应 • 单击按钮可以引发动作事件(ActionEvent) • btn. addActionListener(监听器对象 ) • 监听器对象要实现ActionListener接口 • 在实现接口的方法public void actionPerformed()中可以用e.getSource()方法获取被点击的按钮对象 • 也可以用e.getActionCommand()方法获取按钮的标签或事先为该按钮设置的命令名 例: Button btn=new Button(“按钮标签”); btn.setActionCommand(“命令名”); public void actionPerformed (ActionEvent e) { if (e. getActionCommand() ==“命令名”) … 或 if (e.getSource()==btn) …. }
复选框组件(Checkbox)(JCheckbox) • 复选框的构造函数: Checkbox(String) //带显示标签 Checkbox(String,boolean)//带显示标签和初始状态 • true表示被选中,false表示未选中。
单选按钮组件(JRadioButton) • 单选钮组件要先用CheckboxGroup()方法构造一个CheckboxGroup对象,再用Checkbox(String, CheckboxGroup ,boolean)方法创建Checkbox对象,如果不同的Checkbox在创建时属于同一个CheckboxGroup ,则组成单选按钮组(互斥选择)。 • 单选钮组件的状态属性,为true/false,表示选中或未选中。
单选按钮组件CheckboxGroup对事件的响应 • CheckboxGroup类不是java.awt.*包中的类,它是Object的直接子类,所以按钮组不能响应事件; • 单选按钮组中的每个单选按钮(CheckBox)可以响应ItemEvent类的事件。
创建组合框: Choice() //创建组合框
创建列表: List()//创建列表 List(int) //以指定的可见行数创建列表 List(int,boolean) //指定可见行数和是否允许多项选择
滚动条的构造函数: Scrollbar() //垂直滚动条 Scrollbar (int) //指定方向的滚动条Scrollbar .HORIZONTAL (水平) Scrollbar .VERTICAL (垂直) Scrollbar(int, int, int, int,int)//指定方向、初始值、滚动块大小、最小值、最大值
6.3 Java的事件处理 6.3.1 基本概念 事件处理三要素:事件源、事件类型、事件监听器 • 事件源:图形用户界面中引发事件的组件。 事件源可以注册监听器,并向其发送事件对象。 • 事件类型:Java的所有事件都封装成一个类,这些事件类定义在java.awt.event包中,所有的事件类都继承了AWTEvent类的一个方法getSource(),返回引发事件的事件源对象。 • 事件监听器:不同类型的事件发生后,由事件监听器接收事件并调用相应的事件处理方法。
AWTEvent类体系结构图 AWTEvent ActionEvent TextEvent AdjustmentEvent ComponentEvent ItemEvent WindowEvent ContainerEvent InputEvent PaintEvent FocusEvent MouseEvent KeyEvent
事件适配器(Adapter): (1)事件源.add***Listener(监听器对象); (2)监听器对象所在的类要实现***Listener接口,并实现接口中的抽象方法。如果接口中的抽象方法有2到多个,如MouseListener,MouseMotionListener,KeyListener,WindowListener等。则系统定义了***Adapter,让***Adapter实现相应***Listener接口; (3)有了Adapter(适配器),可以定义其子类(重写需要的方法),然后让其子类的对象充当监听器对象。
6.3.2 动作事件(ActionEvent )的处理 • 能够触发动作事件的动作有: • 点击按纽(Button) • 双击一个列表框(List)中的选项 • 选择菜单项(MenuItem) • 在文本框(TextField/TextArea)中敲回车 动作事件对应的事件类是ActionEvent类,其主要方法有: (1) public String getActionCommand( )—获得引发事件的项目信息 例:public void actionPerformed(ActionEvent e) { if ( e.getActionCommand( ) == ″命令名″ ) … }
(2) public int getModifiers( )—当动作是同时与功能键配合使用时,获得引发事件的组合键信息,动作事件对应的事件监听器是ActionListener, 其主要方法是: actionPerformed(ActionEvent e) 实现动作事件的操作过程是: 1)注册动作监听器 addActionListener(监听器对象) 2) 监听器实现ActionListener接口的方法:actionPerformed(ActionEvent e)
6.3.3 文本事件(TextEvent)的处理 • TextEvent类只包含一个事件,即代表文本框中文本变化的事件TextValueChanged。在文本框中删除字符、改变字符、键入字符都将引发这个事件。 • 引发文本事件的基本组件有两种:单行文本框TextField和多行文本框TextArea,它们都是TextComponent的子类。
例 6-7 TextComponentEvent.java import java.applet.*; import java.awt.*; import java.awt.event.*; public class TextComponentEvent extends Applet implements TextListener,ActionListener { TextField tf; TextArea ta; public void init() { tf = new TextField(45); ta = new TextArea(10,45); add(tf); add(ta); tf.addActionListener(this); tf.addTextListener(this); }
public void textValueChanged(TextEvent e) { if(e.getSource()==tf) ta.setText(((TextField)e.getSource()).getText()); } public void actionPerformed(ActionEvent e) { if(e.getSource()==tf) ta.setText(""); } }
6.3.4 选择事件(ItemEvent)的处理 • ItemEvent类只包含一个事件,即代表选择项的选中状态发生变化的事件ITEM-STATE-CHANGED。 • 引发这类事件的动作包括: (1) 改变列表类List对象选项的选中或不选中状态。 (2) 改变下拉列表类Choice对象选项的选中或不选中状态。 (3) 改变复选按钮类Checkbox对象的选中或不选中状态。 (4) 改变检测盒菜单项CheckboxMenuItem对象的选中或不选中状态。
ItemEvent类的主要方法有: (1) public ItemSelectable getItemSelectable( ) 此方法返回引发选中状态变化事件的事件源,包括List对象、Choice对象、Checkbox对象等。 (2) public Object getItem( ) 此方法返回引发选中状态变化事件的具体选择项,例如用户选中的Choice中的具体item,通过调用这个方法可以知道用户选中了哪个选项。 (3) public int getStateChange( ) 此方法返回具体的选中状态变化类型,它的返回值在ItemEvent类的几个静态常量列举的集合之内: ① ItemEvent.SELECTED: 代表选项被选中。 ② ItemEvent.DESELECTED: 代表选项被放弃不选。
例 6-10 TestChoice.java import java.applet.*; import java.awt.*; import java.awt.event.*; public class TestChoice extends Applet implements ItemListener { Choice size; Button btn; public void init() { size = new Choice(); size.add("10"); size.add("14"); size.add("18"); add(size); btn = new Button("效果"); add(btn); size.addItemListener(this); }
public void itemStateChanged(ItemEvent e) { Choice temp; Font oldF; String s; int si; if(e.getItemSelectable( ) instanceof Choice) { oldF = btn.getFont(); temp = (Choice)(e.getItemSelectable()); s = temp.getSelectedItem(); si = Integer.parseInt(s); btn.setFont (new Font(oldF.getName(),oldF.getStyle(),si)); } } }
6.3.5 调整事件(AdjustmentEvent)的处理 AdjustmentEvent类只包含一个事件——ADJUSTMENT-VALUE-CHANGED事件。 与ItemEvent事件引发的离散状态变化不同,ADJUSTMENT-VALUE-CHANGED是GUI组件状态发生连续变化的事件,引发这类事件的具体动作有: (1) 操纵滚动条(Scrollbar)改变其滑块位置。 (2) 操纵用户自定义的Scrollbar对象的子类组件,改变其滑块位置。
AdjustmentEvent类的主要方法有: (1) public Adjustable getAdjustable( ) 这个方法返回引发状态变化事件的事件源,能够引发状态变化事件的事件源都是实现了Adjustable接口的类。 (2) public int getAdjustmentType( ) 这个方法返回状态变化事件的状态变化类型,其返回值在AdjustmentEvent类的几个静态常量所列举的集合之内。 • AdjustmentEvent.BLOCK-DECREMENT: 代表点击滚动条下方引发块状下移的动作。 • AdjustmentEvent.BLOCK-INCREMENT: 代表点击滚动条上方引发块状上移的动作。 • AdjustmentEvent.TRACK:代表拖动滚动条滑块的动作。