资源描述
第 7讲 Java用 户 界 面( AWT篇 ) * 温 故 *类成员的访问权限 public、protected、友好、private子类继承,子类继承父类的成员在同一包:子类可继承父类非私有成员不同包:子类可继承父类的protcted和public成员。变量的声明、变量的作用域、变量的隐藏方法的声明、参数的传值方式、方法的覆盖、构造函数多态、对象的上转型对象父类变量引用子类对象。抽象类与接口 本 讲 要 点 AWTSwingSWT布局管理器的使用 AWTl AWTn抽象窗口工具包AWT (Abstract Window Toolkit) 是 Java 提供的建立图形用户界面GUI (Graphics User Interface)工具集,可用于生成现代的、鼠标控制的图形应用接口,并且可以无需修改,就可以在各种软硬件平台上运行。n AWT可用于Java的applet和applications中, AWT设计的初衷是支持开发小应用程序的简单用户界面。n它支持图形用户界面编程的功能包括:用户界面组件、事件处理模型、图形和图像工具(包括形状、颜色和字体类)和布局管理器,可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关。 GUI与 AWT在java中,AWT是用来处理图形最基本的方式,它可以用来创建java的applet和窗口。AWT包提供4大类功能:1、图形界面组件,如:窗口、按钮、菜单等2、2D图形绘制组件,如:直线、圆形。3、布局对象:用来安排图形界面组件的位置。4、事件处理对象,用来处理图形界面组件所触发的事件。图形用户界面(Graphics User Interface 简称GUI)通过提供菜单、按钮、标签标识、鼠标等,完成对计算机发出指令、启动应用程序等操作任务。 java.awt包中提供了GUI设计所使用的类和接口,提供了各种用于GUI设计的标准类,图1显示了AWT中主要类之间的关系。由图可知,AWT中的类按其功能的不同可分为5大类。 图1 AWT类层次 基 本 GUI组 件 类 ( Component) Java的图形用户界面的最基本组成部分是组件(Component),组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。用来提供人机交互的基本控制界面 类java.awt.Component是许多组件类的父类,Component类中封装了组件通用的方法和属性,如图形的组件对象、大小、显示位置、前景色和背景色、边界、可见性等,因此许多组件类也就继承了Component类的成员方法和成员变量,这些成员方法是许多组件都共有的方法,常见的成员方法如表1所示 方法名方法功能void setBackground(Color c)设置组件的背景颜色void setEnabled(boolean b)设置组件是否可用void setFont(Font f)设置组件的文字void setForeground(Color c)设置组件的前景颜色void setLocation(int x, int y)设置组件的位置void setName(String name)设置组件的名称void setSize()设置组件的大小 void setVisible(boolean b)设置组件是否可见boolean hasFocus()检查组件是否拥有焦点int getHeight()返回组件的高度int getWidth()返回组件宽度表1 Component类常用方法 容 器 类 ( Container )容器Container也是一个类,它允许其他的组件被放置在其中。容器本身也是一个组件,具有组件的所有性质,但是它的主要功能是容纳其它组件和容器。容器java.awt.Container是Component的子类,一个容器可以容纳多个组件,并使它们成为一个整体。容器可以简化图形化界面的设计,以整体结构来布置界面。所有的容器都可以通过add()方法向容器中添加组件。 Container常用的有三个主要类型:窗口(Window)、面板(Panel)和 Applet,常用的有Panel, Frame, Applet 布局管理类容器里组件的位置和大小是由布局管理器决定的,每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器 事件处理类在JDK1.1及其以后的版本中,AWT采用委托事件模型进行事件处理,委托事件模型包括事件源、事件和事件监听器,详细内容请参阅第7章 基本图形类用于构造图形界面的类,如字体类(Font)、绘图类(Graphics)、图像类(Image)和颜色类(Color)等 Swing Swing的含义:是Java在开发这个新的图形界面项的项目名称。 AWT是Swing的基础。Swing的产生主要原因就是AWT不能满足图形化用户界面发展的需要。 Swing是用Java实现的轻量级( light-weight)组件 Swing是由100%纯Java实现的,Swing组件是用Java实现的轻量级( light-weight)组件,没有本地代码,不依赖操作系统的支持,这是它与AWT组件的最大区别。由于AWT组件通过与具体平台相关的对等类(Peer)实现,因此Swing比AWT组件具有更强的实用性。Swing在不同的平台上表现一致,并且有能力提供本地窗口系统不支持的其它特性。 Swing采用了一种MVC的设计范式 Swing外观感觉采用可插入的外观感觉(Pluggable Look and Feel,PLpublic class MyFrame extends Framepublic static void main(String args )MyFrame fr = new MyFrame(Hello Out There!); /构造方法fr.setSize(200,200); /设置Frame的大小,缺省为(0,0)fr.setBackground(Color.red); /设置Frame的背景,缺省为红色fr.setVisible(true); /设置Frame为可见,缺省为不可见public MyFrame (String str)super(str); /调用父类的构造方法 Pane类import java.awt.*;public class FrameWithPanel extends Framepublic FrameWithPanel(String str)super(str); public static void main(String args)FrameWithPanel fr = new FrameWithPanel(Frame with Panel);Panel pan=new Panel();fr.setSize(200,200);fr.setBackground(Color.red); /框架fr的背景颜色设置为红色fr.setLayout(null); /取消布局管理器 pan.setSize(100,100);pan.setBackground(Color.yellow); /设置面板pan的背景颜色为黄色fr.add(pan); /用add方法把面板pan添加到框架fr中fr.setVisible(true); 创建一个黄色面板和一个青色面板,将它们并排添加到标题为Panel Usage Demo,大小为270200的框架窗口内。 程序的运行结果见图 。 使 用 图 形 用 户 界 面 AWT的 组 件Label类的构造方法主要功能Label()创建一个没有文字的标签Label(Strng str)创建一个以str为文字的标签Label(String str,int align)创建一个以str为文字的标签,并以align 为对齐方式LEFT CENTER RIGHT 表示左中右Label类的方法主要功能int getAligment()返回标签内文字的对齐方式 void setAligment(int align)设置标签内文字的对齐方式String getText()获得标签内的文字void setText(String text)设置标签内的文字Java.awt.Label 的方法 Color类用来设置颜色,构造方法有两个Color(float r,float g,float b);和Color(int r,int g,int b);其中r、g、b表示红绿蓝3色float 型取值范围0.01.0;int 型取值范围0-256标签组件是用来在窗口中显示文字的组件,由Label类来创造/ 在窗口中的指定位置创建一个标签import java.awt.*;public class Window11_3 public static void main(String args) Frame fra=new Frame(这是创建标签的程序 ); Label b1=new Label(); / 创建一个空标签 fra.setBounds(0,0,300,200); b1.setText(欢迎使用JAVA语言);/为标签添加文字 b1.setAlignment(Label.CENTER);/设置标签在窗口中央位置 b1.setBackground(Color.blue);/引用Componentlei的方法设置标签背景颜色 b1.setForeground(Color.red); /引用Componentlei的方法设置标签中的文字颜色 fra.add(b1) ; fra.setVisible(true); 创建大小相同、背景色不同、显示内容与文本的对齐方式各不相同的三个标签,并将它们左端对齐,竖向排列在一个300200大小的窗口内。 按 钮 组 件按钮组件提供用户快速启动某一动作的方法, 通过点击鼠标或按下键盘某键完成一定的操作。由java.awt类库的Button类创建。Button类的构造方法主要功能Button()创建一个没有标题的按钮 Button(String str)创建一个以str 为标题的按钮Button类的方法主要功能String getLabel() 获得按钮的标题void setLabel(String str)获得设置按钮的标题为str import java.awt.*; / 创建 按钮public class Window11_4 public static void main(String args) Frame fra=new Frame( 创建按钮程序 ); Button but=new Button(push me); / 创建一个按钮 fra.setBounds(0,0,300,200); fra.add(but) ; /将按钮添加到窗口中 fra.setVisible(true); /显示窗口 import java.awt.*; / 创建一个给定大小尺寸的 按钮public class Window11_5 public static void main(String args) Frame fra=new Frame( 创建按钮程序 ); Button but=new Button(push me); / 创建一个按钮 fra.setBounds(0,0,300,200); fra.setLayout(null);/关闭页面设置 but.setBounds(50,50,100,50);/设置按钮的大小 fra.add(but) ; /将按钮添加到窗口中 fra.setVisible(true); /显示窗口 创建四个大小相同的6030尺寸的按钮,依照其标题的意义分别安置到上、下、左、右四个方位,使它们呈十字形,并对称地排放到280270的窗口中心。 文 本 框文本框是用来在窗口中显示文字的矩形框,这些文字可以被用户编辑。文本框可以用来输入文字、编辑文字并显示输入的文字、读取用户输入的文字。由TextField类来创建。TextField类的构造方法主要功能TextField()创建一个空的文本框TextField(int colnmns)创建一个空的文本框,具有指定的列TextField(String text)创建一个包含有”text” 内容的文本框TextField(String text,int colnmns)创建一个具有指定列且包含内容的文本框TextField类的方法主要功能 String getText()获得文本框的内容int getColumns()获得文本框的列数void setText(String text)设置文本框的内容为text void setColumns(int columns)设置文本框的列数 / 创建文本框 import java.awt.*;public class Window11_6 public static void main(String args) throws Exception Frame fra=new Frame( 创建文本框程序 ); TextField txt1=new TextField(10 ); TextField txt2=new TextField(10); fra.setBounds(0,0,300,200); fra.setLayout(null);/关闭页面设置 txt1.setBounds(50,50,130,20);/设置文本框的大小 txt2.setBounds(50,70,130,20); fra.add(txt1) ; /将 文本框添加到窗口中 fra.add(txt2) ; fra.setVisible(true); /显示窗口 / System.in.read(); / System.exit(0); 实现如图所示的身份验证界面。其中窗口大小为300200,标签尺寸为7020,文本域尺寸为10020,按钮尺寸为10030. 布局管理器决定容器中组件的尺寸和位置 java.awt包中共定义了五种布局编辑类,每个布局编辑类对应一种布局策略,分别是 FlowLayout(流式布局) BorderLayout(边界布局) GridLayout(格式布局) GridBagLayout(格袋布局) LayoutManager 布 局 管 理 器 使 用 布 局 管 理 器 布 局 界 面 的 方 法为创建容器的布局管理器,可调用setLayout (LayoutManager, layout)方法,以布局类的实例为参数。例如: FlowLayout flowLayout=new FlowLayout();/创建流布局类对象 Panel panelObj=new Panel();/创建容器类对象 panelObj.setLayout(flowLayout); /panel对象调用以FlowLayout对象调用以FlowLayout布局类对象为参数的setLayout()方法,设置布局。 在pane()的构造方法中,有Pane(LayoutManager layout)构造符,在构造面板容器的同时指定布局管理器,因此上面可写成如下: FlowLayout flowLayoutObj=new FlowLayout(); Panel panelObj=new Panel(flowLayoutObj);/以流布局类对象为 参数 FlowLayout FlowLayout是一种最基本的布局管理器是 java.awt.Applet、java.awt.Panel 和 javax.swing.JPanel的默认布局方式在容器中,从左到右依次放置GUI组件当组件排到容器一行的末尾时,则从下一行开始接着排列组件每行组件的对齐方式可以是: 左对齐、中间(默认对齐方式)和右对齐 构造方法主要下面几种: FlowLayout(FlowLayout.RIGHT,20,40);/*第一个参数表示组件的对齐方式,指组件在这一行中的位置是居中对齐、居右对齐还是居左对齐,第二个参数是组件之间的横向间隔,第三个参数是组件之间的纵向间隔,单位是象素。*/ FlowLayout(FlowLayout.LEFT); /居左对齐,横向间隔和纵向间隔都是缺省值5个象素FlowLayout(); /缺省的对齐方式居中对齐,横向间隔和纵向间隔都是缺省值5个象素 import java.awt.*;public class ExGuiprivate Frame f;private Button b1;private Button b2;public static void main(String args)ExGui that = new ExGui();that.go();public void go()f = new Frame(GUI example);f.setLayout(new FlowLayout(); /设置布局管理器为FlowLayoutb1 = new Button(Press Me); /按钮上显示字符Press Meb2 = new Button(Dont Press Me); f.add(b1);f.add(b2);f.pack(); /紧凑排列,其作用相当于setSize(),即让窗口尽量小,小到刚刚能够包容住b1、b2两个按钮f.setVisible(true); 创建六个TextField组件,组件的内容初始化为江南六大著名水乡古镇的简介,将组件添加到300150大小的应用窗口中,应用窗口使用FlowLayout管理器方案。 BorderLayout BorderLayout是容器FrameJFrame和JApplet的默认布局方式将容器分成五个区域, NORTH (顶部) SOUTH (底部) WEST (左侧) EAST (右侧) CENTER (中间)每个区域最多只能1个组件 构造方法: BorderLayout( hGap, vGap ); hGap 区域间的水平间隙 vGap -区域间的竖直间隙上面两个数据的默认值是0添加组件 myContainer.add( component, position ) component 需要加入到容器中的组件 positions (BorderLayout.NORTH) NORTH, SOUTH, EAST, WEST, CENTER import java.awt.*;public class buttonDirpublic static void main(String args)Frame f = new Frame(BorderLayout);f.setLayout(new BorderLayout();f.add(North, new Button(North);/第一个参数表示把按钮添加到容器的North区域f.add(South, new Button(South);/第一个参数表示把按钮添加到容器的South区域f.add(East, new Button(East); /第一个参数表示把按钮添加到容器的East区域f.add(West, new Button(West);/第一个参数表示把按钮添加到容器的West区域f.add(Center, new Button(Center);/第一个参数表示把按钮添加到容器的Center区域f.setSize(200,200);f.setVisible(true); GridLayout GridLayout布局管理器GridLayout按行与列将容器等分成网格每个组件占用具有相同宽度和高度的网格添加组件占用网格的顺序: 从上到下,从左到右当一行满了,则继续到下一行,仍然是从左到右 GridLayout的构造函数:1) GridLayout(),创建一个默认为1行的网格布局管理器,行布局中所有组件大小相同。2) GridLayout(int rows, int cols),创建一个带指定行数和列数的网格布局管理器,布局中所有组件大小相同。3) GridLayout(int rows, int cols,int hgap, int vgap),创建一个带指定行数、列数、水平与垂直间距的网格布局管理器,布局中所有组件大小相同。 import java.awt.*;public class ButtonGrid public static void main(String args) Frame f = new Frame(GridLayout);f.setLayout(new GridLayout(3,2); /容器平均分成3行2列共6格f.add(new Button(1); /添加到第一行的第一格f.add(new Button(2); /添加到第一行的下一格f.add(new Button(3); /添加到第二行的第一格f.add(new Button(4); /添加到第二行的下一格f.add(new Button(5); /添加到第三行的第一格f.add(new Button(6); /添加到第三行的下一格f.setSize(200,200);f.setVisible(true); 将华东六省一市的名称作为按钮组件标题,将这些按钮添加到大小为300200的应用窗口中,窗口应用3行2列的网格布局管理器方案。 GridBagLayout GridBagLayout布局管理器是java.awt包中最灵活、同时又是最复杂的一种布局管理器,它类似于网格布局。 GridBagLayout布局管理器把组件组织成长方形的网格,使用这种布局,可灵活地把组件放在长方形网格的任何行和列中,它也允许特定的组件跨多行和多列。 GridBagLayout类只有一个不带任何参数的构造函数,仅仅创建一个布局。为了指出组件的位置和尺寸的约束,必须使用GridBagContraints类对象,通过调用GridBagContraints类对象的属性变量限制组件的位置和尺寸。创建GridBagConstraints: GridBagContraints gbcObj=new GridBagConstraints();/创建 GridBagContraints类的属性如下1) gridx、gridy,指出组件所在的列数和行数;两者组成长方形网格(单元),从左到右,gridx的值由小到大,从上到下gridy的值由小至大。2) gridwidth、gridheight,指出组件跨的行数和列数;默认方式,组件的大小等于它显示区域的大小(显示网格的区域),但是可以使用属性gridwidth、gridheight来扩大显示区域的大小。缺省值为1。如果指定了gridx和gridy,则组件不能实现跨行或跨列;如果不指定gridx和gridy属性,则类似于网格布局,组件按加入到容器的布局组件。 3) anchor,指出组件在网格上的方位。其默认值是CENTER,居中放置。anchor的有效值为: GridBagConstraints.NORTH(北) GridBagConstraints.SOUTH(南) GridBagConstraints.WEST(西) GridBagConstraints.EAST(东) GridBagConstraints.NORTHWEST(西北) GridBagConstraints.NORTHEAST(东北) GridBagConstraints.SOUTHWEST(西南) GridBagConstraints.SOUTHEAST(东南) GridBagConstraints.CENTER(中,默认) NORTHNORTH WEST CENTERWEST SOUTHSOUTH WEST EASTNORTH EASTSOUTH EAST 4) fill,是否充满网格,其有效值为: GridBagConstraints.BOTH(填满整个区域); GridBagConstraints.HORIZONTAL(填满水平方向的显示区域,不改变高度) GridBagConstraints.VERTICAL(填满垂直方向的显示区域,不改变高度) GridBagConstraints.NONE(默认,不改变尺寸)5) weightx,weighty,是否拉长组件。用于指明当容器时,如何 行、列间分配额外的空间。它取值0.0或1.0。默认为0.0,表明每个网格的显示区域不变。 Frame f=new Frame(); f.setLayout(new GridBagLayout(); GridBagConstraints constraints=new GridBagConstraints(); Label lb=new Label( 姓名); constraints.fill=GridBagConstraints.NONE; constraints.anchor=GridBagConstraints.CENTER; constraints.weightx=0; constraints.weighty=0; constraints.gridx=0; constraints.gridy=0; constraints.gridwidth=1; constraints.gridheight=1; constraints.insets=new Insets(10,10,10,10); f.add(lb,constraints); 布局客户信息界面创建如上图所示界面,包括客户名称、电话号码、性别和年龄、录入等。创建过程:识别所需的布局管理器类型 识别各控件在布局中的特性。 小 结 1Frame是一个顶级窗口。Frame的缺省布局管理器为BorderLayout。2Panel 无法单独显示,必须添加到某个容器中。 Panel 的缺省布局管理器为FlowLayout。3当把Panel 作为一个组件添加到某个容器中后,该Panel 仍然可以有自己的布局管理器。因此,可以利用Panel 使得BorderLayout 中某个区域显示多个组件,达到设计复杂用户界面的目的 。4如果采用无布局管理器 setLayout(null),则必须使用setLocation(),setSize(),setBounds()等方法手工设置组件的大小和 位置,此方法会导致平台相关,不鼓励使用。
展开阅读全文