已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章 图形用户界面设计程序设计开发中一个重要的工作就是做好程序与用户之间的交互,而图形用户界面就是用图形的方式实现人与计算机的交互,它为用户提供了一个直观、方便、快捷的输入输出界面。Java 提供了强大的图形用户包,开发人员可以方便地建立用户图形窗口界面,响应并处理交互事件。本章重点介绍了 Java 的 GUI 相关包和类,用 AWT 生成图形化用户界面,LayoutManager布局管理器,AWT 事件处理模型,AWT 常用组件,以及Swing包生成图形化用户界面。71 Java的GUI图形用户界面(Graphics user interface,GUI)是指用图形的方式,借助菜单、按钮等标准界面元素和鼠标操作,帮助用户方便地向计算机系统发出指令、启动操作,并将系统运行的结果以图形方式显示给用户的技术。由于用户界面设计质量的好坏直接影响软件的使用,Java 语言对此也十分重视,几乎在 JDK 每个新的版本中,都增加了一定的 GUI 程序设计新技术或功能,Java 语言的 GUI 发展始终保持着较好的连贯性和兼容性。目前 Java 主要提供了两个处理图形用户界面的类库:java.awt 和 javax.swing。AWT:抽象窗口工具集(Abstract Windows Toolkit),由于 Java 代码可以在不同的系统平台运行,而不同平台的图形界面外观设计各有差异,所以 Java 程序的图形用户界面在不同的平台上可能出现不同的运行效果,其外观取决于具体的平台,所以称 AWT 是一个抽象的工具集。Swing:Swing 是在 AWT 的基础上构建的,提供了比标准 AWT 组件更强大和灵活的功能。与 AWT 组件不同的是,Swing 组件不是由特定的平台代码实现,而是纯粹的 Java 代码,因此能够实现与平台的无关(此类组件一般被称为轻量级组件)。利用 GUI 类库设计和实现图形用户界面的工作主要有两个:一是应用的外观设计,即创建组成图形界面的各部件,指定其位置和属性关系,根据需要进行排列,从而构成完整的图形用户界面的物理外观;二是与用户的交互处理,包括定义图形用户界面的事件以及各部件对不同时间的响应处理。72 用 AWT 生成图形化用户界面抽象窗口工具包 AWT(Abstract Window Toolkit)是 API 为 Java 程序提供的建立图形用户界面 GUI(Graphics User Interface)工具集,AWT 可用于 Java 的 applet 和 applications中。它支持图形用户界面编程的功能包括:用户界面组件;事件处理模型;图形和图像工具,包括形状、颜色和字体类;布局管理器,可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关;数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴。721 java.awt 包AWT 类包含在 java.awt 包中,主要包括用户界面组件、事件处理模型、图形和图像工具、布局管理器等。Java.awt 包中的主要类及组件类的继承关系如图 7-1 所示。图 7-1 java.awt 包的主要类及组件类的继承关系722 组件Java 的图形用户界面的最基本组成部分是组件(Component),组件是一个以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。类 java.awt.Component 是许多组件类的父类,Component 类中封装了组件通用的方法和属性,如图形的组件对象、大小、显示位置、前景色和背景色、边界、可见性等,因此许多组件类也就继承了 Component 类的成员方法和成员变量,常用的成员方法如表所示。表7-1 Component 类常用方法方法方法说明public String getName()获得组件的名称public void setName(String name)设置组件的名称public Dimension getSize()获得为以 Dimension 对象的形式返回组件的大小public void setSize(Dimension d)设置为以 Dimension 对象的形式返回组件的大小public Color getForeground()获得组件的前景颜色public void setForeground(Colorc)设置组件的前景颜色public Color getBackground()获得组件的背景颜色public void setBackground(Colorc)设置组件的背景颜色public void setLocation(intx, inty)设置组件的位置public void setVisible(boolean b)根据参数 b 的值显示或隐藏此组件。73 常用容器容器 java.awt.Container 也是一个类,实际上是 Component 的子类,因此容器本身也是一个组件,具有组件的所有性质,但是它的主要功能是容纳其它组件和容器。一个容器可以容纳多个组件,并使它们成为一个整体。容器可以简化图形化界面的设计,以整体结构来布置界面。所有的容器都可以通过 add()方法向容器中添加组件。有三种类型的常用容器:Frame、Panel。731 Frame容器Frame 类是 Container 类的间接子类。当需要一个窗口时,可使用 Frame 或其子类创建一个对象。窗口也是一个容器,可以向窗口添加组件。窗口默认地被系统添加到显示器屏幕上,因此,不允许将一个窗口添加到另一个容器中。Frame 是顶级窗口,可以显示标题,重置大小。当 Frame 被关闭,将产生 WindowEvent事件,Frame 无法直接监听键盘输入事件。【例 7-1】使用 Frame 容器的例子。import java.awt.*;public class testFrame public static void main(String args) Frame fr = new Frame(这是一个Frame测试); / 构造方法fr.setSize(200, 200); / 设置 Frame 的大小,缺省为(0,0)fr.setBackground(Color.red); / 设置 Frame 的背景,缺省为红色fr.setVisible(true);/ 设置 Frame 为可见,缺省为不可见程序结果如图所示:图7-2 显示Frame一般要生成一个窗口,通常是用 Window 的子类 Frame 来进行实例化,而不是直接用到 Window 类。Frame 的外观就像我们平常在 windows 系统下见到的窗口,有标题、边框、菜单、大小等等。每个 Frame 的对象实例化以后,都是没有大小和不可见的,因此必须调用 setSize( )来设置大小,调用 setVisible(true)来设置该窗口为可见的。在程序中我们不难看出,创建Frame对象后,必须使用对象名.方法的方式进行使用,比较麻烦,可以通过继承的方式简化操作。因此我们可以创建一个自己的Frame类,该类继承自Frame。然后在们main方法中实例化自己的类就可以了,因此可以将上面的程序改为:【例 7-2 】常用的Frame写法import java.awt.*;public class testFrame public static void main(String args) new MyFrame(这是一个Frame测试);class MyFrame extends FrameMyFrame(String str)super(str);setSize(200, 200);setBackground(Color.red);setVisible(true);732 Panel面板java.awt 包的 Panel 类是 Container(容器)的子类,因此 Panel 类及其子类的实例也是一个容器,Panel 型容器的默认布局是 FlowLayout 布局。Panel 类创建的对象称为面板,经常在一个面板内添加若干个组件后,再把面板放到另一个容器里。【例 7-3】一个使用 Panel 容器的简单例子。import java.awt.*;public class testPanel public static void main(String args) Frame fr = new Frame(包含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);程序结果如图所示:图7-3 显示带有Panel面板的Frame74 布局管理器为了使我们生成的图形用户界面具有良好的平台无关性,实现跨平台的特性并且获得动态的布局效果,Java 语言中,提供了布局管理器(LayoutManager)这个工具来管理组件在容器中的布局,如:排列顺序,组件的大小、位置,当窗口移动或调整大小后组件如何变化等,而不使用直接设置组件位置和大小的方式。每个容器都有一个布局管理器,不同的布局管理器使用不同算法和策略,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器。容器可以通过选择不同的布局管理器来决定布局。在程序中安排组件的位置和大小时,应该注意以下两点:1容器中的布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件的这些属性。如果试图使用 Java 语言提供的 setLocation(),setSize(),setBounds() 等方法,则都会被布局管理器覆盖。2如果用户确实需要亲自设置组件大小或位置,则应调用 setLayout(null)方法取消该容器的布局管理器。布局管理器主要包括:FlowLayout 、 BorderLayout 、 GridLayout 、 CardLayout 、GridBagLayout。741 FlowLayout 布局FlowLayout 是容器 Panel 和 Applet 的缺省布局管理器。在其中组件的放置规律是从上到下、从左到右进行放置,如果容器足够宽,第一个组件先添加到容器中第一行的最左边,后续的组件依次添加到上一个组件的右边,如果当前行已放置不下该组件,则放置到下一行的最左边。构造方法主要下面几种:(1)FlowLayout(FlowLayout.RIGHT,20,40);第一个参数 FlowLayout.RIGHT,表示组件的对齐方式,指明组件在这一行中的位置是居中对齐、居右对齐还是居左对齐,第二个参数是组件之间的横向间隔,第三个参数是组件之间的纵向间隔,单位是像素。(2)FlowLayout(FlowLayout.LEFT);居左对齐,横向间隔和纵向间隔都是缺省值 5 个像素。(3)FlowLayout();缺省的对齐方式居中对齐,横向间隔和纵向间隔都是缺省值 5 个像素。【例 7-4】FlowLayout 布局管理器例子。import java.awt.*;public class testFlowLayout public static void main(String args) new MyFrame(这是一个FlowLayout测试);class MyFrame extends FrameButton btn1 = new Button(open);Button btn2 = new Button(close);Button btn3 = new Button(exit);MyFrame(String str)super(str);setSize(300, 100);setLayout(new FlowLayout();add(btn1);add(btn2);add(btn3);setVisible(true);程序结果如图所示:图7-4 FlowLayout布局策略742 BorderLayout 布局BorderLayout 是容器 Window、Frame 和 Dialog 的缺省布局管理器。BorderLayout 布局管理器把容器分成 5 个区域:North,South,East,West 和 Center,每个区域只能放置一个组件。构造方法主要下面几种:(1)public BorderLayout( ) 构造一个组件之间没有间距的新边框布局。(2)public BorderLayout(inthgap, intvgap)构造一个具有指定组件间距的边框布局。水平间距由 hgap 指定,垂直间距由 vgap 指定。【例 7-5】一个 BorderLayout 布局管理器的应用。import java.awt.*;public class testBorderLayout public static void main(String args) new MyFrame(这是一个BorderLayout测试);class MyFrame extends FrameButton btn1 = new Button(NORTH);Button btn2 = new Button(SOUTH);Button btn3 = new Button(EAST);Button btn4 = new Button(WEST);Button btn5 = new Button(CENTER);MyFrame(String str)super(str);setSize(400, 300);setLayout(new BorderLayout();add(btn1,BorderLayout.NORTH);add(btn2,BorderLayout.SOUTH);add(btn3,BorderLayout.EAST);add(btn4,BorderLayout.WEST);add(btn5,BorderLayout.CENTER);setVisible(true);程序结果如图所示:图7-5 BorderLayout布局策略在使用 BorderLayout 的时候,如果容器的大小发生变化,其变化规律为:组件的相对位置不变,大小发生变化。例如容器变高了,则 North、South 区域不变,West、Center、East区域变高;如果容器变宽了,West、East 区域不变,North、Center、South 区域变宽。不一定所有的区域都有组件,如果四周的区域(West、East、North、South 区域)没有组件,则由 Center 区域去补充,但是如果 Center 区域没有组件,则保持空白。如果不注明位置,则默认将控件添加的Center 区域。743 GridLayout 布局GridLayout 布局使容器按照“行列数”的方式将窗口分割成彼此大小相等的区域,在每个区域内放置一个组件。构造方法主要下面几种:(1)public GridLayout( ) 创建具有默认值的网格布局,即每个组件占据一行一列。(2)public GridLayout(introws, intcols)创建具有指定行数和列数的网格布局。给布局中的所有组件分配相等的大小。(3)public GridLayout(introws, intcols, inthgap, intvgap)创建具有指定行数和列数的网格布局。给布局中的所有组件分配相等的大小。 此外,将水平和垂直间距设置为指定值。水平间距将置于列与列之间。垂直间距置于行与行之间。 【例 7-6】一个 GridLayout 布局管理器的应用。import java.awt.*;public class testGridLayout public static void main(String args) new MyFrame(这是一个GridLayout测试);class MyFrame extends FrameButton btn1 = new Button(按钮1);Button btn2 = new Button(按钮2);Button btn3 = new Button(按钮3);Button btn4 = new Button(按钮4);Button btn5 = new Button(按钮5);Button btn6 = new Button(按钮6);MyFrame(String str)super(str);setSize(300, 150);setLayout(new GridLayout(2,3,5,5);add(btn1);add(btn2);add(btn3);add(btn4);add(btn5);add(btn5);add(btn6);setVisible(true);程序结果如图所示:图7-6 GridLayout布局策略744 CardLayout 布局CardLayout 布局管理器能够帮助用户处理两个以至更多的成员共享同一显示空间,它把容器分成许多层,每层的显示空间占据整个容器的大小,但是每层只允许放置一个组件,当然每层都可以利用 Panel 来实现复杂的用户界面。牌布局管理器(CardLayout)就象一副叠得整整齐齐的扑克牌一样,有 54 张牌,但是你只能看见最上面的一张牌,每一张牌就相当于牌布局管理器中的每一层。构造方法主要下面几种:(1)public CardLayout( ) 创建一个间距大小为 0 的新卡片布局。(2)public CardLayout(inthgap, intvgap)创建一个具有指定水平间距和垂直间距的新卡片布局。水平间距置于左右边缘。垂直间距置于上下边缘。常用方法主要下面几种:public void first(Containerparent) 翻转到容器的第一张卡片。 public void next(Containerparent) 翻转到指定容器的下一张卡片。如果当前的可见卡片是最后一个,则此方法翻转到布局的第一张卡片。public void previous(Containerparent) 翻转到指定容器的前一张卡片。如果当前的可见卡片是第一个,则此方法翻转到布局的最后一张卡片。public void last(Containerparent) 翻转到容器的最后一张卡片。【例 7-7】一个 CardLayout 布局管理器的应用。import java.awt.*;import java.awt.event.*; /事件处理机制,下一节的内容public class testCardLayout public static void main(String args) new MyFrame(这是一个testCardLayout测试);class MyFrame extends Frame implements ActionListenerButton btn1 = new Button(按钮1);Button btn2 = new Button(按钮2);Button btn3 = new Button(按钮3);CardLayout cl = new CardLayout(10,10);MyFrame(String str)super(str);setSize(150, 150);setLayout(cl);add(btn1,page1);第二个参数page1表示的是你对这层牌所取的名字add(btn2,page2);add(btn3,page3);btn1.addActionListener(this); / 注册监听器btn2.addActionListener(this);btn3.addActionListener(this);setVisible(true);public void actionPerformed(ActionEvent e)cl.next(this);程序结果如图所示:图7-7 CardLayout布局策略745 容器的嵌套在复杂的图形用户界面设计中,为了使布局更加易于管理,具有简洁的整体风格,一个包含了多个组件的容器本身也可以作为一个组件加到另一个容器中去,容器中再添加容器,这样就形成了容器的嵌套。下面是一个容器嵌套的例子。【例 7-8】容器嵌套的例子。import java.awt.*;public class testContainer public static void main(String args) new MyFrame(这是一个容器嵌套的测试);class MyFrame extends Frame Button btn1 = new Button(打开);Button btn2 = new Button(关闭);Button btn3 = new Button(退出);Panel p = new Panel();TextArea ta = new TextArea();MyFrame(String str)super(str);setSize(300, 200);p.setLayout(new GridLayout(1,3,5,5);/设置Panel画布的布局为1行3列,间隔为5个像素的GridLayout布局p.add(btn1);p.add(btn2);p.add(btn3);add(ta);/将文本区填入到Frame容器中的中间区域add(p,BorderLayout.SOUTH);setVisible(true);程序结果如图所示:图7-8 容器的嵌套746 布局管理器小结1Frame 是一个顶级窗口。Frame 的缺省布局管理器为 BorderLayout。2Panel 无法单独显示 ,必须添加到某个容器中。 Panel 的缺省布局管理器为FlowLayout。3当把 Panel 作为一个组件添加到某个容器中后,该 Panel 仍然可以有自己的布局管理器。因此,可以利用 Panel 使得 BorderLayout 中某个区域显示多个组件,达到设计复杂用户界面的目的 。4如果采用无布局管理器 setLayout(null),则必须使用setLocation(); setSize(); setBounds()等方法手工设置组件的大小和位置,但是此方法会导致平台相关,不鼓励使用。75 AWT 事件处理模型前面的主要内容是如何放置各种组件,使图形界面更加丰富多彩,但是还不能响应用户的任何操作,要能够让图形界面接收用户的操作,就必须给各个组件加上事件处理机制。751 事件处理机制在事件处理的过程中,主要涉及三类对象:事件:用户对界面操作在 java 语言上的描述,以类的形式出现,例如键盘操作对应的事件类是 KeyEvent。事件源:事件发生的场所,通常就是各个组件,例如按钮 Button。事件处理者:接收事件对象并对其进行处理的对象。例如,如果用户用鼠标单击了按钮对象 button,则该按钮 button 就是事件源,而 Java运行时系统会生成 ActionEvent 类的对象 e,该对象中描述了该单击事件发生时的一些信息,然后,事件处理者对象将接收由 Java 运行时系统传递过来的事件对象 actionE 并进行相应的处理。由于同一个事件源上可能发生多种事件,因此 Java 采取了授权处理机制,事件源可以把在其自身所有可能发生的事件分别授权给不同的事件处理者来处理。比如在 Canvas 对象上既可能发生鼠标事件,也可能发生键盘事件,该 Canvas 对象就可以授权给事件处理者一来处理鼠标事件,同时授权给事件处理者二来处理键盘事件。有时也将事件处理者称为监听器,主要原因也在于监听器时刻监听着事件源上所有发生的事件类型,一旦该事件类型与自己所负责处理的事件类型一致,就马上进行处理。授权模型把事件的处理委托给外部的处理实体进行处理,实现了将事件源和监听器分开的机制。事件处理者(监听器)通常是一个类,该类如果要能够处理某种类型的事件,就必须实现与该事件类型相对的接口。下面例子中类ButtonHandler之所以能够处理 ActionEvent 事件,原因在于它实现了与 ActionEvent 事件对应的接口 ActionListener。每个事件类都有一个与之相对应的接口。【例 7-9】事件响应的例子。import java.awt.*;import java.awt.event.*;public class testActionListener public static void main(String args) new MyFrame(这是一个监听器测试);class MyFrame extends FrameButton b = new Button(Press Me!);MyFrame(String str)super(str);setSize(200, 100);setLayout(new FlowLayout(); / 设置布局管理器add(b);b.addActionListener(new ButtonHandler();/ 注册监听器进行授权,该方法的参数是事件处理者对象,本方法授权处理ActionEvent,因为方法名是 addActionListenersetVisible(true);class ButtonHandler implements ActionListener / 实现接口 ActionListener 才能做事件 ActionEvent 的处理者public void actionPerformed(ActionEvent e)/ 系统产生的 ActionEvent 事件对象被当作参数传递给该方法System.out.println(按钮被按动);/ 本接口只有一个方法,因此事件发生时,系统会自动调用本方法,需要做的操作就把代码写在则个方法里。 当点击按钮时,控制台输出结果为:图7-9 事件响应结果通常来说,单独编写一个类实现接口的方式比较麻烦,所以人们通常将实现图形用户界面的类直接实现相关接口。因此上例中的MyFrame类可以修改为:class MyFrame extends Frame implements ActionListenerButton b = new Button(Press Me!);MyFrame(String str)super(str);setSize(200, 100);setLayout(new FlowLayout();add(b);b.addActionListener(this);setVisible(true);public void actionPerformed(ActionEvent e)System.out.println(按钮被按动); 使用授权处理模型进行事件处理的一般方法归纳如下:1对于某种类型的事件 XXXEvent, 要想接收并处理这类事件,必须定义相应的事件监听器类,该类需要实现与该事件相对应的接口 XXXListener;2 事件源实例化以后,必须进行授权,注册该类事件的监听器,使用addXXXListener(XXXListener ) 方法来注册监听器。752 事件类java.util.EventObject 类是所有事件对象的基础父类,所有事件都是由它派生出来的。AWT 的相关事件继承于 java.awt.AWTEvent 类,这些 AWT 事件分为两大类:低级事件和高级事件。低级事件是指基于组件和容器的事件,当一个组件上发生事件,如:鼠标的进入,点击,拖放等,或组件的窗口开关等,触发了组件事件。高级事件是基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类,如在 TextField 中按 Enter 键会触发ActionEvent 事件,滑动滚动条会触发 AdjustmentEvent 事件,或是选中项目列表的某一条就会触发 ItemEvent 事件。1低级事件组件事件(ComponentEvent):组件尺寸的变化,移动。容器事件(ContainerEvent):组件增加,移动。窗口事件(WindowEvent):关闭窗口,窗口闭合,图标化。焦点事件(FocusEvent):焦点的获得和丢失。键盘事件(KeyEvent):键按下、释放。鼠标事件(MouseEvent):鼠标单击,移动。2高级事件(语义事件)动作事件(ActionEvent):按钮按下,TextField 中按 Enter 键。调节事件(AdjustmentEvent):在滚动条上移动滑块以调节数值。项目事件(ItemEvent):选中项目。文本事件(TextEvent):文本对象的内容发生改变。7.5.3 事件监听器每类事件都有对应的事件监听器,监听器是接口,根据动作来定义方法。例如,与键盘事件 KeyEvent 相对应的接口是:public interface KeyListener extends EventListener public void keyPressed(KeyEvent ev);public void keyReleased(KeyEvent ev);public void keyTyped(KeyEvent ev);本接口中有三个方法,根据这三个方法的方法名就能够知道应该是什么时候调用哪个方法了。当键盘刚按下去时,将调用 keyPressed( )方法执行,当键盘抬起来时,将调用keyReleased( )方法执行,当键盘敲击一次时,将调用 keyTyped( )方法执行。与窗口有关的事件接口:public interface WindowListener extends EventListenerpublic void windowClosing(WindowEvent e);/把退出窗口的语句写在本方法中public void windowOpened(WindowEvent e);/窗口打开时调用public void windowIconified(WindowEvent e);/窗口图标化时调用public void windowDeiconified(WindowEvent e);/窗口非图标化时调用public void windowClosed(WindowEvent e);/窗口关闭时调用public void windowActivated(WindowEvent e);/窗口激活时调用public void windowDeactivated(WindowEvent e);/窗口非激活时调用AWT 的组件类中提供注册和注销监听器的方法:注册监听器:public void add (listener);注销监听器:public void remove (listener);754 AWT事件及其相应的监听器接口Java 语言类的层次非常分明,因而只支持单继承,为了实现多重继承的能力,Java 用接口来实现,一个类可以实现多个接口,这种机制比多重继承具有更简单、灵活、更强的功能。在 AWT 中就经常用到声明和实现多个接口。无论实现了几个接口,接口中已定义的方法必须一一实现,如果对某事件不感兴趣,可以不具体实现其方法,而用空的方法体来代替。但却必须所有方法都要写上。【例 7-10】一个事件处理模型的应用示例。import java.awt.*;import java.awt.event.*;public class testThreeListener public static void main(String args) new MyFrame(这是三个监听器测试);class MyFrame extends Frame implements MouseMotionListener, MouseListener,WindowListener Label l = new Label(实现三个事件的监听);TextField tf = new TextField(30);MyFrame(String str)super(str);setSize(300, 200);add(l,North);add(tf,South);addMouseMotionListener(this); / 注册监听器 MouseMotionListeneraddMouseListener(this); / 注册监听器 MouseListeneraddWindowListener(this); / 注册监听器 WindowListenersetVisible(true);public void mouseDragged(MouseEvent e) / 实现 mouseDragged 方法String s = Mouse dragging : X = + e.getX() + Y = + e.getY();tf.setText(s);public void mouseMoved(MouseEvent e) public void mouseClicked(MouseEvent e) public void mouseEntered(MouseEvent e) String s = The mouse entered;tf.setText(s);public void mouseExited(MouseEvent e) String s = The mouse has left the building;tf.setText(s);public void mousePressed(MouseEvent e) public void mouseReleased(MouseEvent e) public void windowClosing(WindowEvent e) / 为了使窗口能正常关闭,程序正常退出,需要实现 windowClosing 方法System.exit(0);public void windowOpened(WindowEvent e) public void windowIconified(WindowEvent e) public void windowDeiconified(WindowEvent e) public void windowClosed(WindowEvent e) public void windowActivated(WindowEvent e) public void windowDeactivated(WindowEvent e) 程序运行结果如下所示,在窗口中按下鼠标左键移动鼠标,相应的坐标会显示在下面的文本框中。图7-10 事件响应结果755 事件适配器Java 语言为一些 Listener 接口提供了适配器(Adapter)类。可以通过继承事件所对应的 Adapter 类,重写需要方法,无关方法不用实现。事件适配器为我们提供了一种简单的实现监听器的手段,可以缩短程序代码。但是,由于 Java 的单一继承机制,当需要多种监听器或此类已有父类时,就无法采用事件适配器了。java.awt.event 包中定义的事件适配器类包括以下几个:ComponentAdapter( 组件适配器)ContainerAdapter( 容器适配器)FocusAdapter( 焦点适配器)KeyAdapter( 键盘适配器)MouseAdapter( 鼠标适配器)MouseMotionAdapter( 鼠标运动适配器)WindowAdapter( 窗口适配器)通常这些事件适配器类以匿名的内部类方式使用,下面是采用窗口适配器的代码示例:【例 7-11】应用WindowAdapter类示例。import java.awt.*;import java.awt.event.*;public class testWindowAdapter public static void main(String args) new MyFrame(这是WindowAdapter应用);class MyFrame extends Frame MyFrame(String str)super(str);setSize(300, 200);addWindowListener(new WindowAdapter()/定义窗口事件的实现public void windowClosing(WindowEvent e)System.exit(0);); / 重新定义窗口的关闭方法setVisible(true);76 Swing简介前面我们介绍了如何使用AWT开发用户界面。本节将介绍一个新的可以替代AWT的图形界面类Swing。Swing是AWT的扩展,它提供了更强大和更灵活的组件集合。除了我们已经熟悉的组件如按钮、复选框和标签外,Swing还包括许多新的组件,如选项板、滚动窗口、树、表格。许多一些开发人员已经熟悉的组件,如按钮,在Swing都增加了新功能。而且,按钮的状态改变时按钮的图标也可以随之改变。与AWT组件不同,Swing组件实现不包括任何与平台相关的代码。Swing组件是纯Java代码,因此与平台无关。一般用轻量级(lightweight)这个术语描述这类组件。在Swing包中的类和接口的数量众多,本章只对常用的部分简要描述。实际上从AWT过渡到Swing还是很容易的。因为绝大多数的AWT组件都对应了相关的Swing组件,只要在组件名称前面加“J”就可以了。同时Swing包中的类具有比AWT提供更多的功能。因此现在Swing事实上已经取代AWT。下面这个例子使用 Frame 容器更改为使用JFrame容器。【例 7-11】使用 JFrame 容器的例子。import javax.swing.*;/导入Swing包public class testJFrame public static void
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 结伴旅游协议书
- 2025-2026学年安徽省马鞍山市初三化学上册期中考试试卷及答案
- 西师版四年级历史上册月考考试试题及答案
- 施工结算协议书
- 众筹开店协议书
- 2025版肝硬化症状诊断及护理保健方法
- 2025版阑尾炎诊疗与护理指南
- 口腔术前健康宣教
- 格威营销机构介绍
- 介绍一种运输方式
- 2025成人高等学校专升本招生统一考试政治试题及答案解析
- 益生菌与肝性脑病改善-洞察及研究
- 前掷实心球教学课件
- 2025年【小学】汉字听写大会竞赛题库(含答案)
- DGTJ08-2004B-2020 建筑太阳能光伏发电应用技术标准
- 麦语言培训课件
- 运动营养监管-洞察及研究
- 丘陵山地果园环境适应性强的电动除草机器人研发
- 2024年中国大唐集团有限公司招聘考试真题
- 绿色低碳建筑设计 课件 第3章 建筑空间设计
- 前置仓模式下叮咚买菜供应链管理优化策略研究
评论
0/150
提交评论