1.04k likes | 1.31k Views
第 4 章 Java 图形 用户界面设计. 4.1 概述 4.2 AWT 与 Swing 组件 4.3 事件 处理 4.4 容器与 布局 管理器 4.5 对话框 4.6 菜单. 学习提要. 掌握常用的 GUI 标准组件及图形界面的设计方法; 掌握 JAVA 的事件处理机制和常用事件响应代码的编写方法; 掌握 布局管理、 对话框及 菜单的 设计方法. 4.1 概述. 4.1.1 基本概念 ( 1 ) GUI — 图形用户界面 ( Graphics User Interface )
E N D
第4章 Java图形用户界面设计 4.1 概述 4.2 AWT 与 Swing组件 4.3 事件处理 4.4 容器与布局管理器 4.5 对话框 4.6 菜单
学习提要 • 掌握常用的GUI标准组件及图形界面的设计方法; • 掌握JAVA的事件处理机制和常用事件响应代码的编写方法; • 掌握布局管理、对话框及菜单的设计方法
4.1 概述 4.1.1 基本概念 (1) GUI—图形用户界面(Graphics User Interface) 使用图形的方式借助菜单、按钮等标准界面元素和鼠标操作,帮助用户和计算机之间进行交互。 (2)AWT——抽象窗口工具集(abstract window toolkit) Java中用来生成图形用户界面的类库是java.awt包,它Java中基本包中最大的一个,定义了所有GUI组件类,以及其它用于构造图形界面的类。Sun公司在JDK1.0中就提供了AWT。 为了实现跨平台特性,AWT类库中的各种操作被定义成在一个并不存在的“抽象窗口”中进行。
AWTEvent Panel Applet Font GUI设计涉及到的类和接口 Java.lang.Object Container Componet Frame Window Graphics MenuComponent 各种布局管理器类
AWT组件的类层次 • Component 组件是所有AWT组件的基类,提供了基本的显示和事件处理特征。
(3) Swing GUI组件 • 在最新的Java EE中,javax.swing包被列入Java的基础类库JFC,其中定义的Swing GUI组件相对于java.awt包的各种GUI组件增加了许多功能。 • Swing组件类 Swing包含250多个类(有些是组件,有些是支持类,组件的名字都以 J 开头), Swing提供了40多个组件,是AWT的4倍,用轻量组件(没有本地对等组件)代替了AWT的重量组件(与本地对等组件相关联)。 重量级组件是指组件的属性跟操作系统有关,轻量级组件跟操作系统无关,轻量级组件在不同平台下显示效果一样 。
Swing组件简介(续) • Swing包中有4个最重要的类: JApplet、JFrame、JDialog、JComponent • JComponent的所有子类都是轻量级组件,其它三个都是重量级组件,轻量级组件必须在这些重量容器中绘制自己。 • 除模仿AWT组件所提供的功能外,几乎所有的Swing替代组件都有其他一些特性,如Swing按钮可以显示图标和文本,AWT按钮只显示文本。
Swing组件简介(续) Swing采用了一种MVC的设计范式,即“模型-视图-控制器”(Model-View-Controller): • 模型(Model)——用于存储定义该组件的数据; • 视图(View)——用模型中的数据生成该组件的可视化表示(即显示出该组件); • 控制器(Controller)——响应用户对该组件的交互操作。 MVC是一种先进的组件设计模式。
MVC结构示意图 视图 (组件外观) UI代表 (向组件提供外观和感觉) 模型 (组件数据) 控制器 (处理事件,更改模型或者视图)
(4)设计图形界面的步骤 1)根据需要创建界面元素,设计出界面的物理外观; 2) 定义界面元素对不同事件的响应,实现界面与用户的交互功能。
(5)设计图形界面的一般原则 • 保持风格的一致性 • 背景颜色耐看,避免黑、大红、艳绿、明黄 • 采用统一字体,颜色对比清晰、字号大小合理 • 布局统一,组件尺寸恰当、外观一致 • 注重操作的友好性 • 必要的操作提示与信息反馈 • 考虑用户的普遍习惯 • 选用适合主题的色调和风格,简洁明快,重在协调 • 多浏览国外著名公司的网站 • 参考大公司开发的专业产品 • 商业经典色系:蓝色、灰色、蓝白、蓝灰 • 界面的边界一般设为不可调整大小,以免影响布局
4.1.2 图形用户界面元素 分三类:容器、组件、用户自定义成分。 (1)容器(container) 是用来组织其他界面成分和元素的单元,如窗体(form、frame)。 主要作用: 用容器可以分解图形界面的复杂性。 特点: 容器有一定的范围、位置、背景,容器里可以包含许多其他的界面元素,并按一定规则来排列所包含的元素,可以被用来完成某种交互功能,容器还可能被包含在其他容器中。
(2)组件(Component) TextField input=new TextField(6); add(input); input.addActionListener(this); public void actionPerformed(ActionEvent e) { if(e.getSource()==input) output.setText(input.getText()+“,欢迎你!”); } 组件是图形界面的最小单位,里面不能再包含其他成分。如:命令按钮、文本域、标签等。组件的作用是完成与用户的一次交互,如接受用户指令、向用户显示文本等。 使用组件的步骤: 创建组件对象→确定属性→布局到容器中→注册事件监听者→重写事件处理方法。
(3)用户自定义图形界面成分 用户自定义成分是指利用Java类库中的类及其方法来绘制符合用户特定要求的图形界面成分,也可以将已经存在的图形、动画等加载到当前程序中来。 1) 绘制图形 Graphics类——绘制直线、各种矩形、多边形、圆和椭圆等。 Point类——表示一个象素点 Dimension类——表示宽和高 Rectangle类——表示一个矩形 Polygon类——表示一个多边形 Color类——表示颜色
2) 显示文字 Java中用一个Font类的对象来表示一种字体显示效果,包括字体类型、字型和字号。 Font.PLAIN——正常 字型常量 Font.BOLD——粗体 Font.ITALIC——斜体 1) 创建字体对象 FontMyFont=new Font(“TimesRoman”,Font.BOLD,12); 2)使用字体对象 g.setFont(MyFont); //Graphics对象 btn.setFont(MyFont); //某个名为btn的按钮对象 可以用getFont()方法返回当前对象使用字体的情况。
3) 控制颜色 Applet中显示的字符串或图形的颜色可以用Color类的对象来控制,每个Color对象代表一种颜色,用户可以直接使用系统定义好的13种颜色常量,也可以通过红、绿、蓝三色比例来创建自己的Color对象。 • 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. g.setColor(blueColor); • 利用系统的颜色常量: g.setColor(Color.cyan); • GUI控件的颜色设置方法 public void setBackground(Color c); //设置背景颜色 public Color getBackground(); //取得背景颜色 public void setForeground(Color c); //设置前景颜色 public Color getForeground(); //取得前景颜色
4) 显示图象 Java中可以利用Graphics类的drawImage()方法显示图象。显示图象涉及3个方法: • drawImage(参数1,参数2,参数3) 参数1——Image对象,可以用系统为Applet类定义的getImage()方法获得。 参数2、参数3——显示时图象左上角的X.Y坐标 • getImage(参数1,参数2 ) 参数1——图象文件所在的URL地址 参数2——图象文件的文件名 • getDocumentBase() 获取含有该Applet的HTML文件的URL地址。
例:用户界面使用示例TestGraphics.java 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中的事件处理机制来实现。
4.2 AWT 与 Swing组件 常用的GUI标准组件AWT(Swing)介绍 • 标签(Label)(J Label ) Label有三个构造函数: Label() Label (String) Label (String,int)创建一个带初始字符串及指定对齐方式的标签 0= Label .LEFT、 1= Label .RIGHT、2=Label.CENTER void setAlignment(int)方法用来设置标签对齐方式。
恢复密码显示:input2.setEchoChar((char) 0); • 文本域(Textfield) (JTextfield )(JPasswordField 密码框) Textfield有四个构造函数: Textfield( ) Textfield (int) Textfield (String) Textfield(String,int)带有初始文本及指定长度
多行文本组件(TextArea)(JTextArea) • 多行文本组件有五个构造函数: TextArea () //创建一个多行文本框 TextArea (int , int) //用指定的行数、列数创建 TextArea (String) //用指定的初始文本创建 TextArea (String, int , int ) //用指定的初始文本、行数、列数创建 TextArea( String,int, int, int)//用指定的初始文本、行数、列数及滚动条创建 • 事件响应与TextField相同。
按钮(Button)(JButton) 可以改变外观但不改变功能 按钮有两个构造函数: Button() Button(String Lable)//创建一个带标示字符串的按钮
Button对事件的响应 • 单击按钮可以引发动作事件(ActionEvent) • 所在程序要实现ActionListener接口 • 注册监听者addActionListener( ) • 在实现接口的方法体中可以用e.getSource()方法获取按钮对象 • 也可以用e.getActionCommand()方法获取按钮的标签或事先为该按钮设置的命令名 例: Button bt=new Button(“按钮标签”); bt.setActionCommand(“命令名”); public void actionPerformed (ActionEvent e) { if (e. getActionCommand() ==“按钮标签”) …… } 或e.getSource() 或 命令名
复选框组件(Checkbox)(JCheckbox) • 复选框有三个构造函数: Checkbox() //不带显示标签 Checkbox(String) //带一个显示标签 Checkbox(String,boolean)//带显示标签和初始状态 • 复选框组件有状态属性,为on/off,默认情况下为off
Checkbox对事件的响应 对比按钮: public void actionPerformed (ActionEvent e) { if (e.getSource()) == bt1 …… } 判断事件源对象: public void itemStateChanged(ItemEvente){ If (e.getItemSelectable())instanceof Checkbox ……}
单选钮组件(JRadioButton) • 单选钮组件要先用CheckboxGroup()方法构造一个CheckboxGroup对象,再用Checkbox(String, CheckboxGroup ,boolean)方法创建Checkbox对象,如果不同的Checkbox在创建时属于同一个CheckboxGroup ,则组成单选钮组。 • 单选钮使用的构造函数: Checkbox(String, CheckboxGroup ,boolean)//带显示标签、属于哪个按钮组和初始状态 • 单选钮组件有状态属性,为true/false,创建时指定。
单选钮组件CheckboxGroup对事件的响应 • CheckboxGroup类不是java.awt.*包中的类,它是Object的直接子类,所以按钮组不能响应事件,但是按钮组中的每个按钮可以响应ItemEvent类的事件。由于单选按钮组中的每个单选按钮都是Checkbox对象,它们对事件的响应与复选框对事件的响应相同。
创建下拉列表: Choice() //创建下拉列表(组合框)
创建列表: List() //创建列表 List(int) //以指定的可见行数创建列表 List(int,boolean) //指定可见行数和是否允许多项选择
列表组件(List)对事件的响应(注意: 双击事件不能覆盖单击事件)
滚动条有三个构造函数: Scrollbar() //创建一个垂直滚动条 Scrollbar (int) //指定方向的滚动条, Scrollbar .HORIZONTAL (水平状) Scrollbar .VERTICAL (垂直状) Scrollbar(int, int, int, int,int)//指定方向、初始值、滚动块大小、最小值、最大值
4.3 事件处理 4.3.1 基本概念 事件处理三要素:事件源、事件类型、事件监听者 事件源:图形用户界面的每个可能产生事件的组件。 事件源可以注册监听者对象,并向其发送事件对象。 事件类型:Java的所有事件都封装成一个类,这些事件类被集中在java.awt.event包中,所有的事件类都继承了AWTEvent类的一个方法getsSource(),该方法返回所发生事件的对象,即事件源。 事件监听者:不同类型的事件发生后,由事件监听者接收事件并调用相应的事件处理方法。 监听者对象:实现了监听者接口的类的实例,具有监听和处理某类事件的功能。
JAVA的事件处理机制 • JDK1.1开始引入了委托事件模型,不同的事件源可产生不同种类的事件,不同的事件由不同的监听者处理。事件发生后,事件源将事件对象发给已经注册的所有监听者;监听者对象随后会根据事件对象内封装的信息,决定自己该如何响应这个事件。
AWTEvent类体系结构图 EventObject AWTEvent ActionEvent TextEvent AdjustmentEvent ComponentEvent ItemEvent WindowEvent ContainerEvent InputEvent PaintEvent FocusEvent MouseEvent KeyEvent
事件处理过程: 一般说来,每个事件类都有一个监听者接口与之对应,而事件类中的每个具体事件类型都有一个具体的抽象方法与之相对应,当具体事件发生时,这个事件将被封装成一个事件类的对象作为实际参数传递给与之对应的具体方法,由这个具体方法负责响应并处理发生的事件。 例如:与ActionEvent类事件对应的接口是ActionListener,这个接口定义了抽象方法: public void actionPerformed(ActionEvent e);
凡是要处理ActionEvent事件的类都必须: 1)实现ActionListener接口 2)重写actionPerformed()方法 在重写的方法体中,常需要调用参数e的有关方法,如调用e.getSource()查明ActionEvent事件的事件源,然后采取相应的措施处理该事件。 事件适配器(Adapters): • 定义Listener时可以继承Adapters类,这样只需要重写自己需要的方法,其他方法不必实现,可以减少不必要的工作量。
4.3.2 动作事件(ActionEvent )的处理 • 能够触发动作事件的动作有: • 点击按纽 • 双击一个列表框中的选项 • 选择菜单项 • 在文本框中输入回车 动作事件对应的事件类是ActionEvent类,其主要方法有: (1) public String getActionCommand( )—获得引发事件的项目信息 例:public void actionPerformed(ActionEvent e) { if ( e.getActionCommand( ) == ″按钮标签″ ) … }
(2) public int getModifiers( )—当动作是同时与功能键配合使用时,获得引发事件的组合键信息,如:ALT_MASK 动作事件对应的事件监听器是ActionListener, 其主要方法是: actionPerformed(ActionEvent e)—发生动作事件时被调用 实现动作事件的操作过程是: 1)注册动作事件监听器addActionListener(ActionListener) 2) 实现ActionListener接口的方法:actionPerformed(ActionEvent e)
4.3.3 文本事件(TextEvent)的处理 • TextEvent类只包含一个事件,即代表文本区域中文本变化的事件TEXT-VALUE-CHANGED,在文本区域中改变文本内容。例如,删除字符、键入字符都将引发这个事件。这个事件比较简单,不需要特别判断事件类型的方法和常量。 • Java中用于文本处理的基本组件有两种:单行文本框TextField和多行文本区域TextArea,它们都是TextComponent的子类。
例 TextComponentEvent.java import java.applet.*; import java.awt.*; import java.awt.event.*; public class TextComponentEvent extends Applet implements TextListener,ActionListener { TextFieldtf; TextArea ta; public void init() { tf = new TextField(45); ta = new TextArea(10,45); add(tf); add(ta); tf.addActionListener(this); tf.addTextListener(this); }