第八章 图形程序设计入门
1.从软件体系结构上看,通常将软件分为三层:客户层,逻辑层,数据层
2.实现图形界面是用到的Java系统的类库:AWT类库(重型类库)、Swing类库(轻型类库)
3.重型组件:重型类库中的类创建的组件
特点:重型组件以来本地GUI资源,只适用于简单的GUI程序设计,不适用于复杂的GUI项目,易发生平台故障、不稳定、不灵活
分类:容器组件(能包含其他组件的组件)、非容器组件
4.轻型组件:轻型类库中类创建的组件
特点:不依赖本地GUI资源,适用于复杂的GUI项目,比重型组件更稳定、通用和灵活
分类:容器组件、非容器组件
5.容器(container类)
Java中有窗口(window)、面板(panel)两种主要容器
6.框架(JFrame):是window类的子类,是一种带标题框并且可以改变大小的窗口
常用方法:
本身定义的构造方法和实用方法
① JFrame() 创建一个无标题的窗
② JFrame(String title)创建一个带标题为title的窗口
③ Public void setTitle(String title) 设置窗口的标题
④ Public String getTitle() 获取窗口的标题
⑤ Public void setBackground(Color color) 摄制窗口的背景颜色为color
⑥ Public void setResizable(Boolean bol) 设置窗口是否可调整大小,窗口的默认是可调整大小的
⑦ Boolean isResizable() 获取窗口是否可调整大小的信息
从Component类中继承的方法
① Public void setLocation(int x,int y) 设置窗口位置
② Public void setBounds(int x,int y,int widh,int height) 设置窗口的大小和位置
③ Public void setSize(int width, int height) 设置窗口的大小
④ Public void setVisible(Boolean vis) 设置窗口是否可见,窗口默认是不可见的
从Container类中继承的方法
① Public Component add(Component comp) 在容器中添加一个组件comp
② Public void setLayout(LayoutManager mgr) 将窗口的布局管理器设置为mgr
③ Public void validate() 调用该方法确保窗口中添加的组件能显示出来
从Window类中继承的方法
Public void dispose() 调用该方法将撤销当前窗口,并释放当前窗口所使用的资源
7.创建框架
8.框架居中
①获取屏幕的宽度和高度
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
int screenWidth =screenSize.width; //获取屏幕的宽度
int screenHeight =screenSize.height; //获取屏幕的高度
②框架居中时左上角的坐标
Dimension frameSize=frame.getSize();
int x=(screenWidth – frameSize.width)/2;
int y=(screenHeight – frameSize.height)/2;
9.在框架中添加组件:JFrame类创建的窗口还包含一个内容窗格,使用getContentPanel()方法获取窗口的内容窗格
10.面板(JPanel)
面板不能独立存在,创建面板后必须使用container类的add()方法将他装入到另一个面板或框架中
构造方法:public JPanel(); / public JPanel(LayoutManager layout);
11.对容器常见的3种操作:
设置容器的布局管理器:container.setLayout(new specificlayout()); //将容器container的布局管理其改为new specificlayout()
向容器中添加组件:container.ass(component);
从容器中删除组件:container.remove(component);
12.FlowLayout布局:
FlowLayout类常用的方法:
① FlowLayout() 利用该构造方法可以创建一个布局
② FlowLayout(int aligin,int hgap,int vgap) 利用该构造方法可以创一个布局对象,则容器中组建的对齐方式aligin可取FlowLayout.LEFT、FlowLayout.CENTER、FlowLayout.RIGHT
③ Public void setAlignment(int aligin) 调用该方法可以设置布局的对齐方式
④ Public void setHgap(int hgap) 调用该方法可以设置容器中组建的水平间距为hgap像素
⑤ Public void setVgap (int hgap) 调用该方法可以设置容器中组建的垂直间距为hgap像素
13.GridLayout布局:
此部剧将容器划分为若干行,若干列的网格区域,组件就安置在这些网格中
GridLayout布局规则:向容器中添加组件时,从容器的第一行开始,按组件添加的顺序,由左到右将组建排列在容器的网格中,第一行排满后,再从第二行的左边开始排列组件,以此类推,直到组件排完
GridLayout类的构造方法:
① Public GridLayout(int rows,int columns,int hGap,int vGap) 该方法用于创建一个布局对象,该对象将容器划分为rows行,columns列
② Public GridLayout(int rows, int Columns) 该方法用于创建一个布局对象,此布局对象将容器划分为rows行,columns列
③ Public GridLayout() 每行存放一个组件
14.BorderLayout布局
此布局将容器空间划分为东西南北中五个区域,中间区域最大,他是JFrame容器的默认布局对象
BorderLayout对象的布局规则:每向荣其中加入一个组件,都应该知名这个组件放在哪个区域中。区域由borderLayout中的静态常量CENTER、NORTH、SOUTH、WEST、EAST标识

BorderLayout类的构造方法:
① public BorderLayout(int hGap,int Vgap) 该方法用于创建一个布局对象,该布局对象把容器中组建之家的水平和垂直间距分别设置为hGap和vGap像素
② public BorderLayout() 该方法用于创建一个布局对象,该布局把容器中组件之间的水平和垂直间距都设置为0像素
15.CardLayout布局
使用CardLayout布局的容器可以容纳多个组件,但是同一时刻容器只能从这些组件中选一个来显示,就像一叠扑克牌每次只能显示最上面的一张类似,这个被监视的组件将占满容器的所有空间
使用CardLayout布局对象的一般步骤:
假设有一个容器con
① 建CardLayout布局对象card。 CardLayout card=new CardLayout()
② 使用容器的setLayout()方法将容器的布局方式设置为card。 Con.setLayout(card);
③ 调用容器的con.add(String num,Componnemt b)方法将组建b加入容器con中,并给出该组件的代号num
④ 使用布局对象card的show()方法显示容器con中代号为num的组件 card.show (con, num);
16.null布局(空布局)
组件拥有的一个方法setBounds(int a,int b,int width,int height),该调用方法可以设置组件的大小,并能设置组件在容器中的位置
17.绘图相关类
①Color类
Color color=new Color(r ,g,b);
setBackground(Color c)
setForeground(Color c)
② Font类和FontMetrics
Font myFont=new Font(name, style, size);
FontMetrics使用下列属性度量字符的高度:Leading、Ascent、Descent、Height
③ Graphics类
绘制直线: drawLine(x1,y1,x2,y2);
绘制矩形:
空心直角矩形drawRect(x,y,w,h);
有填充颜色的直角矩形fillRect(x,y,w,h);
圆角矩形drawRoundRect(x,y,w,h,aw,ah);
有填充颜色的圆角矩形fillRoundRect(x,y,w,h,aw,ah);
绘制三维矩形 draw3DRect(x,y,w,h,raised);
绘制椭圆:
空心椭圆drawOval(x,y,w,h);
填充颜色椭圆fillOval(x,y,w,h);
绘制圆弧:drawArc(x,y,w,h,angle1,angle2); // fillArc(x,y,w,h,angle1,angle2);
绘制多边形:drawPolygon(x,y,n); fillPolygon(x,y,n);
绘制文本:drawString(String s,int x,int y) drawChars(char data[],int offset,int length,int x,int y)
18.事件驱动程序设计
对于结构化编程,代码执行的次序决定了程序执行的顺序。这类程序是由代码驱动的,人与程序不能产生交互。对于Java图形程序设计,程序设计是由事件驱动的,当激活一个事件时就开始执行相应的代码,人与程序可以进行交互
① 事件:用户在组件上进行操作时,组件产生信息,而这些信息就被封装为事件
② 事件源:又称源对象,在图形界面上,产生事件的组件,如按钮、菜单项、列表框等所有的界面组件都是事件源
③ 事件类:Java系统将界面组件产生的事件进行分组、归类,就构成了事件类的继承关系。 事件类的根类是java.util.EventObject
④ Java系统处理事件的方法:层次事件模型、委托事件模型
监听器:接收事件的对象
为源对象注册监听器:一个对象要成为某个源对象的监听器,必须将其注册到源对象上
把监听器注册到源对象的方法:XEvent à addXListener() x代表某种事件的字符串符号
19.常用Java事件类、处理该事件的接口及接口中的方法
|
事件类/接口名称 |
接口方法及说明 |
|
ActionEvent动作事件类 ActionListener接口 |
actionPerformed(ActionEvent e) 单击按钮、选择菜单项或在文本框中按回车时 |
|
AdjustmentEvent调整事件类 AdjustmentListener接口 |
adjustmentValueChanged(AdjustmentEvent e) 当改变滚动条滑块位置时 |
|
ComponentEvent组件事件类 ComponentListener接口 |
componentMoved(ComponentEvent e)组件移动时 componentHidden(ComponentEvent e)组件隐藏时 componentResized(ComponentEvent e)组件缩放时 componentShown(ComponentEvent e)组件显示时 |
|
ContainerEvent容器事件类 ContainerListener接口 |
componentAdded(ContainerEvent e)添加组件时 componentRemoved(ContainerEvent e) 移除组件时 |
|
FocusEvent焦点事件类 FocusListener接口 |
focusGained(FocusEvent e)组件获得焦点时 focusLost(FocusEvent e)组件失去焦点时 |
|
ItemEvent选择事件类 ItemListener接口 |
itemStateChanged(ItemEvent e) 选择复选框、选项框、单击列表框、选中带复选框菜单时 |
|
KeyEvent键盘事件类 KeyListener接口 |
keyPressed(KeyEvent e)键按下时 keyReleased(KeyEvent e) 键释放时 keyTyped(KeyEvent e)击键时 |
|
MouseEvent鼠标事件类 MouseListener接口 |
mouseClicked(MouseEvent e) 单击鼠标时 mouseEntered(MouseEvent e)鼠标进入时 mouseExited(MouseEvent e)鼠标离开时 mousePressed(MouseEvent e)鼠标键按下时 mouseReleased(MouseEvent e) 鼠标键释放时 |
|
MouseEvent鼠标移动事件类 MouseMotionListener接口 |
mouseDragged(MouseEvent e)鼠标拖放时 mouseMoved(MouseEvent e)鼠标移动时 |
|
TextEvent文本事件类 TextListener接口 |
textValueChanged(TextEvent e) 文本框、多行文本框内容修改时 |
|
WindowEvent窗口事件类 WindowListener接口 |
windowOpened(WindowEvent e)窗口打开后 windowClosed(WindowEvent e)窗口关闭后 windowClosing(WindowEvent e)窗口关闭时 windowActivated(WindowEvent e)窗口激活时 windowDeactivated(WindowEvent e) 窗口失去焦点时 windowIconified(WindowEvent e)窗口最小化时 windowDeiconified(WindowEvent e) 最小化窗口还原时 |
20. 为简化程序员的编程负担,JDK中针对大多数事件监听器接口提供了相应的实现类(事件适配器Adapter),在适配器中,实现了相应监听器接口的所有方法,但不做任何处理,即只是添加了一个空的方法体。
WindowAdapter适配器的定义:
package java.awt.event;
public abstract class WindowAdapter implements WindowListener{
void windowClosing(WindowEvent){}
void windowOpened(WindowEvent e){}
void windowIconified(WindowEvent e){}
void windowDeiconified(WindowEvent e){}
void windowClosed(WindowEvent e){}
void windowActivated(WindowEvent e){}
void windowDeactivated(WindowEvent e){}
}
程序员在定义监听器类时就可以不再直接实现监听接口,而是继承事件适配器类,并只重写所需要的方法即可。
JDK中并没有为所有的监听器接口都提供相应的适配器类。
|
监听器接口 |
对应适配器 |
说明 |
|
MouseListener |
MouseAdapter |
鼠标事件适配器 |
|
MouseLotionListener |
MouseMotionAdapter |
鼠标运动事件适配器 |
|
WindowListener |
WindowAdapter |
窗口事件适配器 |
|
FocusListener |
FocusAdapter |
焦点事件适配器 |
|
KeyListener |
KeyAdapter |
键盘事件适配器 |
|
ComponentListener |
ComponentAdapter |
组件事件适配器 |
|
ContainerListener |
ContainerAdapter |
容器事件适配器 |
示例3:改进的窗口事件处理。
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
public class MyAdapter extends WindowAdapter{
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
使用适配器类的优点:不用实现WindowListener接口中所有的抽象方法,需要哪个方法,重写哪个方法即可,使开发者得以解脱。
但需注意:适配器类并不能完全取代相应的监听器接口,由于Java 单继承机制的限制,如果要定义的监听器类需要同时处理两种以上的GUI事件,则只能直接实现有关的监听器接口,而无法只通过继承适配器实现。
内部类和匿名类在GUI 事件处理中的作用
内部类
在Java GUI 事件处理中,经常采用内部类来定义监听器类,这是因为监听器类中封装的业务逻辑具有非常强的针对性,通常没有重用价值。而且作为内部类的监听器对象可以直接访问外部类中的成员,这可以提供很大的便利。
示例4:在GUI 事件处理中使用内部类 。
public class MyFrame extends Frame{
…
}
匿名类
addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e){
txtDisplay.setText("鼠标位置"+e.getPoint());
}
});
多重监听
由于事件源可以产生多种不同类型的事件,因而可以注册多种不同类型的监听器,但是当事件源发生了某种类型的事件时,只触发事先已就该种事件类型注册过的监听器。
事件源组件和监听器对象的对应关系:
针对同一个事件源组件的同一种事件也可以注册多个监听器。
针对同一个事件源组件的多种事件也可以注册同一个监听器对象进行处置。只是这要求监听器对象是一个“多面手”,即有能力处理各种不同类型的事件
同一个监听器对象可以被同时注册到多个不同的事件源上。

浙公网安备 33010602011771号