450 likes | 666 Views
第 7 讲 Java 用户界面. ( AWT 篇). ** 温故**. 类成员的访问权限 public 、 protected 、友好、 private 子类继承 , 子类继承父类的成员 在同一包:子类可继承父类非私有成员 不同包:子类可继承父类的 protcted 和 public 成员。 变量的声明、变量的作用域、变量的隐藏 方法的声明、参数的传值方式、方法的覆盖、构造函数 多态、对象的上转型对象 父类变量引用子类对象。 抽象类与接口. 本讲要点. AWTSwingSWT 布局管理器的使用. AWT. AWT
E N D
第7讲 Java用户界面 (AWT篇)
** 温故** • 类成员的访问权限 • public、protected、友好、private • 子类继承,子类继承父类的成员 • 在同一包:子类可继承父类非私有成员 • 不同包:子类可继承父类的protcted和public成员。 • 变量的声明、变量的作用域、变量的隐藏 • 方法的声明、参数的传值方式、方法的覆盖、构造函数 • 多态、对象的上转型对象 • 父类变量引用子类对象。 • 抽象类与接口
本讲要点 • AWT\Swing\SWT • 布局管理器的使用
AWT • AWT • 抽象窗口工具包AWT (Abstract Window Toolkit) 是 Java 提供的建立图形用户界面GUI (Graphics User Interface)工具集,可用于生成现代的、鼠标控制的图形应用接口,并且可以无需修改,就可以在各种软硬件平台上运行。 • AWT可用于Java的applet和applications中, AWT设计的初衷是支持开发小应用程序的简单用户界面。 • 它支持图形用户界面编程的功能包括:用户界面组件、事件处理模型、图形和图像工具(包括形状、颜色和字体类)和布局管理器,可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关。
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所示
容器类( 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,PL&F) • Swing使得程序在一个平台上运行时能够有不同的外观
SWT • SWT • SWT是Eclipse组织为了开发Eclipse IDE环境所编写的一组底层图形界面 API。然而到目前为止,SWT无论是在性能和外观上,都超越了SUN公司提供的AWT和Sing。 • 目前Eclipse IDE已经开发到了2.1版本,SWT已经十分稳定。这里指的稳定应该包含两层意思: • 一是指性能上的稳定,其中的关键是源于SWT的设计理念 • 另一个稳定是指SWT API包中的类、方法的名称和结构已经少有改变,程序员不用担心由于Eclipse组织开发进度很快(Eclipse IDE每天都会有一个Nightly版本的发布),而导致自己的程序代码变化过大
Frame类 Java 中“窗口”被视为一个容器。它可以把各种不同的图形界面组件放置到这个容器中,而这些图形界面组件就是容器中的接口,通过图形界面组件所提供的方法,来完成一定的功能。 创建窗口的基本和必要操作包括如下步骤: 1、设置窗口的大小 2、给窗口一个标题 3、在屏幕的某个位置放置窗口 4、显示窗口 5、关闭窗口
import java.awt.*;public class MyFrame extends Frame{public 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 Frame{public 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,大小为270×200的框架窗口内。 程序的运行结果见图 。
使用图形用户界面AWT的组件 Java.awt.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); } } 标签组件是用来在窗口中显示文字的组件,由Label类来创造 Color类用来设置颜色,构造方法有两个 Color(float r,float g,float b);和 Color(int r,int g,int b); 其中r、g、b表示红绿蓝3色float 型取值范围0.0—1.0;int 型取值范围0-256
创建大小相同、背景色不同、显示内容与文本的对齐方式各不相同的三个标签,并将它们左端对齐,竖向排列在一个300×200大小的窗口内。创建大小相同、背景色不同、显示内容与文本的对齐方式各不相同的三个标签,并将它们左端对齐,竖向排列在一个300×200大小的窗口内。
按钮组件 按钮组件提供用户快速启动某一动作的方法, 通过点击鼠标或按下键盘某键完成一定的操作。由java.awt类库的Button类创建。
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); //显示窗口 } }
创建四个大小相同的60×30尺寸的按钮,依照其标题的意义分别安置到上、下、左、右四个方位,使它们呈十字形,并对称地排放到280×270的窗口中心。创建四个大小相同的60×30尺寸的按钮,依照其标题的意义分别安置到上、下、左、右四个方位,使它们呈十字形,并对称地排放到280×270的窗口中心。
文本框 文本框是用来在窗口中显示文字的矩形框,这些文字可以被用户编辑。文本框可以用来输入文字、编辑文字并显示输入的文字、读取用户输入的文字。由TextField类来创建。
// 创建文本框 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); } }
实现如图所示的身份验证界面。其中窗口大小为300×200,标签尺寸为70×20,文本域尺寸为100×20,按钮尺寸为100×30.实现如图所示的身份验证界面。其中窗口大小为300×200,标签尺寸为70×20,文本域尺寸为100×20,按钮尺寸为100×30.
LayoutManager 布局管理器 • 布局管理器决定容器中组件的尺寸和位置 • java.awt包中共定义了五种布局编辑类,每个布局编辑类对应一种布局策略,分别是 • FlowLayout(流式布局) • BorderLayout(边界布局) • GridLayout(格式布局) • GridBagLayout(格袋布局)
使用布局管理器布局界面的方法 为创建容器的布局管理器,可调用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 ExGui{private 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 Me"b2 = new Button("Don't Press Me");f.add(b1);f.add(b2);f.pack(); //紧凑排列,其作用相当于setSize(),即让窗口 尽量小,小到刚刚能够包容住b1、b2两个按钮f.setVisible(true);}}
创建六个TextField组件,组件的内容初始化为江南六大著名水乡古镇的简介,将组件添加到300×150大小的应用窗口中,应用窗口使用FlowLayout管理器方案。创建六个TextField组件,组件的内容初始化为江南六大著名水乡古镇的简介,将组件添加到300×150大小的应用窗口中,应用窗口使用FlowLayout管理器方案。
BorderLayout • BorderLayout • 是容器Frame\JFrame和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 buttonDir{public 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);}}
将华东六省一市的名称作为按钮组件标题,将这些按钮添加到大小为300×200的应用窗口中,窗口应用3行×2列的网格布局管理器方案。将华东六省一市的名称作为按钮组件标题,将这些按钮添加到大小为300×200的应用窗口中,窗口应用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属性,则类似于网格布局,组件按加入到容器的布局组件。
NORTHWEST NORTH NORTHEAST WEST CENTER EAST SOUTHWEST SOUTH SOUTHEAST 3) anchor,指出组件在网格上的方位。其默认值是CENTER,居中放置。anchor的有效值为: GridBagConstraints.NORTH(北) GridBagConstraints.SOUTH(南) GridBagConstraints.WEST(西) GridBagConstraints.EAST(东) GridBagConstraints.NORTHWEST(西北) GridBagConstraints.NORTHEAST(东北) GridBagConstraints.SOUTHWEST(西南) GridBagConstraints.SOUTHEAST(东南) GridBagConstraints.CENTER(中,默认)
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);
布局客户信息界面 • 创建如上图所示界面,包括客户名称、电话号码、性别和年龄、录入等。 • 创建过程: • 识别所需的布局管理器类型 • 识别各控件在布局中的特性。
小 结 • 1.Frame是一个顶级窗口。Frame的缺省布局管理器为BorderLayout。2.Panel 无法单独显示,必须添加到某个容器中。 Panel 的缺省布局管理器为FlowLayout。3.当把Panel 作为一个组件添加到某个容器中后,该Panel 仍然可以有自己的布局管理器。因此,可以利用Panel 使得BorderLayout 中某个区域显示多个组件,达到设计复杂用户界面的目的 。4.如果采用无布局管理器 setLayout(null),则必须使用setLocation(),setSize(),setBounds()等方法手工设置组件的大小和位置,此方法会导致平台相关,不鼓励使用。