AWT图形用户界面设计.docx

上传人:b****6 文档编号:4598279 上传时间:2022-12-07 格式:DOCX 页数:19 大小:41.22KB
下载 相关 举报
AWT图形用户界面设计.docx_第1页
第1页 / 共19页
AWT图形用户界面设计.docx_第2页
第2页 / 共19页
AWT图形用户界面设计.docx_第3页
第3页 / 共19页
AWT图形用户界面设计.docx_第4页
第4页 / 共19页
AWT图形用户界面设计.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

AWT图形用户界面设计.docx

《AWT图形用户界面设计.docx》由会员分享,可在线阅读,更多相关《AWT图形用户界面设计.docx(19页珍藏版)》请在冰豆网上搜索。

AWT图形用户界面设计.docx

AWT图形用户界面设计

第五讲 AWT图形用户界面设计收藏

课前索引

【课前思考】

  1.java语言是跨平台的编程语言,那么图形用户界面如何做到跨平台?

  2.AWT有哪些组件和容器?

它们各自的使用方法是什么?

  3.AWT的事件处理模型是什么?

原理又如何?

5.1用AWT生成图形化用户界面

抽象窗口工具包AWT(AbstractWindowToolkit)是API为Java程序提供的建立图形用户界面GUI(GraphicsUserInterface)工具集,AWT可用于Java的applet和applications中。

它支持图形用户界面编程的功能包括:

用户界面组件;事件处理模型;图形和图像工具,包括形状、颜色和字体类;布局管理器,可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关;数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴。

5.1.1java.awt包

java.awt包中提供了GUI设计所使用的类和接口,可从图5.1中看到主要类之间的关系。

java.awt包提供了基本的java程序的GUI设计工具。

主要包括下述三个概念:

  组件--Component

  容器--Container

  布局管理器--LayoutManager

5.1.2组件和容器

Java的图形用户界面的最基本组成部分是组件(Component),组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。

组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。

类java.awt.Component是许多组件类的父类,Component类中封装了组件通用的方法和属性,如图形的组件对象、大小、显示位置、前景色和背景色、边界、可见性等,因此许多组件类也就继承了Component类的成员方法和成员变量,相应的成员方法包括:

   getComponentAt(intx,inty)

   getFont()

   getForeground()

   getName()

   getSize()

   paint(Graphicsg)

   repaint()

   update()

   setVisible(booleanb)

   setSize(Dimensiond)

   setName(Stringname)等

    容器(Container)也是一个类,实际上是Component的子类,因此容器本身也是一个组件,具有组件的所有性质,但是它的主要功能是容纳其它组件和容器。

  布局管理器(LayoutManager):

每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器。

为了使我们生成的图形用户界面具有良好的平台无关性,Java语言中,提供了布局管理器这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式。

  在程序中安排组件的位置和大小时,应该注意以下两点:

  1.容器中的布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件的这些属性。

如果试图使用Java语言提供的setLocation(),setSize(),setBounds()等方法,则都会被布局管理器覆盖。

 2.如果用户确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:

   setLayout(null);

5.1.3常用容器

容器java.awt.Container是Component的子类,一个容器可以容纳多个组件,并使它们成为一个整体。

容器可以简化图形化界面的设计,以整体结构来布置界面。

所有的容器都可以通过add()方法向容器中添加组件。

有三种类型的容器:

Window、Panel、ScrollPane,常用的有Panel,Frame,Applet。

1.Frame

例:

importjava.awt.*;

  publicclassMyFrameextendsJFrame{

  publicstaticvoidmain(Stringargs[]){

        MyFramefr=newMyFrame("HelloOutThere!

");

                       //构造方法

        fr.setSize(200,200);

                //设置Frame的大小,缺省为(0,0)

        fr.setBackground(Color.red);

                //设置Frame的背景,缺省为红色

        fr.setVisible(true);

                //设置Frame为可见,缺省为不可见

  }

     publicMyFrame(Stringstr){

        super(str);//调用父类的构造方法

     }

  }

一般我们要生成一个窗口,通常是用Window的子类Frame来进行实例化,而不是直接用到Window类。

Frame的外观就像我们平常在windows系统下见到的窗口,有标题、边框、菜单、大小等等。

每个Frame的对象实例化以后,都是没有大小和不可见的,因此必须调用setSize()来设置大小,调用setVisible(true)来设置该窗口为可见的。

  另外,AWT在实际的运行过程中是调用所在平台的图形系统,因此同样一段AWT程序在不同的操作系统平台下运行所看到的图形系统是不一样的。

例如在windows下运行,则显示的窗口是windows风格的窗口;而在UNIX下运行时,则显示的是UNIX风格的窗口。

2.Panel

Panel与Frame类似,可以添加到Frame中。

5.1.4LayoutManager布局管理器

(1)

java为了实现跨平台的特性并且获得动态的布局效果,java将容器内的所有组件安排给一个"布局管理器"负责管理,如:

排列顺序,组件的大小、位置,当窗口移动或调整大小后组件如何变化等功能授权给对应的容器布局管理器来管理,不同的布局管理器使用不同算法和策略,容器可以通过选择不同的布局管理器来决定布局。

布局管理器主要包括:

FlowLayout,BorderLayout,GridLayout,CardLayout,GridBagLayout:

1.FlowLayout

  FlowLayout是Panel,Applet的缺省布局管理器。

其组件的放置规律是从上到下、从左到右进行放置,如果容器足够宽,第一个组件先添加到容器中第一行的最左边,后续的组件依次添加到上一个组件的右边,如果当前行已放置不下该组件,则放置到下一行的最左边。

当容器的大小发生变化时,用FlowLayout管理的组件会发生变化,其变化规律是:

组件的大小不变,但是相对位置会发生变化。

例如上图中有三个按钮都处于同一行,但是如果把该窗口变窄,窄到刚好能够放下一个按钮,则第二个按钮将折到第二行,第三个按钮将折到第三行。

按钮"Open"本来在按钮"OK"的右边,但是现在跑到了下面,所以说"组件的大小不变,但是相对位置会发生变化"。

  构造方法主要下面几种:

  FlowLayout(FlowLayout.RIGHT,20,40);

  /*第一个参数表示组件的对齐方式,指组件在这一行中的位置是居中对齐、居右对齐还是居左对齐,第二个参数是组件之间的横向间隔,第三个参数是组件之间的纵向间隔,单位是象素。

*/

  FlowLayout(FlowLayout.LEFT);

  //居左对齐,横向间隔和纵向间隔都是缺省值5个象素

  FlowLayout();

  //缺省的对齐方式居中对齐,横向间隔和纵向间隔都是缺省值5个象素

例:

Framef=newFrame();

        f.setLayout(newFlowLayout());

        f.add(newButton("Ok"));

        f.add(newButton("Open"));

        f.add(newButton("Close"));

 2.BorderLayout

  BorderLayout是Window,Frame和Dialog的缺省布局管理器。

BorderLayout布局管理器把容器分成5个区域:

North,South,East,West和Center,每个区域只能放置一个组件。

各个区域的位置及大小如下图所示:

f.setLayout(newBorderLayout());

      f.add("North",newButton("North"));

      //第一个参数表示把按钮添加到容器的North区域

在使用BorderLayout的时候,如果容器的大小发生变化,其变化规律为:

组件的相对位置不变,大小发生变化。

例如容器变高了,则North、South区域不变,West、Center、East区域变高;如果容器变宽了,West、East区域不变,North、Center、South区域变宽。

不一定所有的区域都有组件,如果四周的区域(West、East、North、South区域)没有组件,则由Center区域去补充,但是如果Center区域没有组件,则保持空白:

North和Center区域缺少组件

3.GridLayout

  使容器中各个组件呈网格状布局,平均占据容器的空间。

Framef=newFrame("GridLayout");

      f.setLayout(newGridLayout(3,2));//容器平均分成3行2列共6格

      f.add(newButton("1"));//添加到第一行的第一格

      f.add(newButton("2"));//添加到第一行的下一格

      f.add(newButton("3"));//添加到第二行的第一格

4.CardLayout

  CardLayout布局管理器能够帮助用户处理两个以至更多的成员共享同一显示空间,它把容器分成许多层,每层的显示空间占据整个容器的大小,但是每层只允许放置一个组件,当然每层都可以利用Panel来实现复杂的用户界面。

牌布局管理器(CardLayout)就象一副叠得整整齐齐的扑克牌一样,有54张牌,但是你只能看见最上面的一张牌,每一张牌就相当于牌布局管理器中的每一层。

5.容器的嵌套

  在复杂的图形用户界面设计中,为了使布局更加易于管理,具有简洁的整体风格,一个包含了多个组件的容器本身也可以作为一个组件加到另一个容器中去,容器中再添加容器,这样就形成了容器的嵌套。

下面是一个容器嵌套的例子。

例:

f=newFrame("GUIexample3");

       bw=newButton("West");

       bc=newButton("Workspaceregion");

       f.add(bw,"West");

       f.add(bc,"Center");

       p=newPanel();

       f.add(p,"North");

       bfile=newButton("File");

       bhelp=newButton("Help");

       p.add(bfile);

       p.add(bhelp);

       f.pack();

       f.setVisible(true);

小结:

   1.Frame是一个顶级窗口。

Frame的缺省布局管理器为BorderLayout。

   2.Panel无法单独显示,必须添加到某个容器中。

Panel的缺省布局管理器为FlowLayout。

   3.当把Panel作为一个组件添加到某个容器中后,该Panel仍然可以有自己的布局管理器。

因此,可以利用Panel使得BorderLayout中某个区域显示多个组件,达到设计复杂用户界面的目的。

   4.如果采用无布局管理器setLayout(null),则必须使用setLocation(),setSize(),setBounds()等方法手工设置组件的大小和位置,此方法会导致平台相关,不鼓励使用。

5.2AWT事件处理模型

要能够让图形界面接收用户的操作,就必须给各个组件加上事件处理机制。

在事件处理的过程中,主要涉及三类对象:

◇Event-事件,用户对界面操作在java语言上的描述,以类的形式出现,例如键盘操作对应的事件类是KeyEvent。

  ◇EventSource-事件源,事件发生的场所,通常就是各个组件,例如按钮Button。

  ◇Eventhandler-事件处理者,接收事件对象并对其进行处理的对象。

由于同一个事件源上可能发生多种事件,因此java采取了授权处理机制(DelegationModel),事件源可以把在其自身所有可能发生的事件分别授权给不同的事件处理者来处理。

比如在Canvas对象上既可能发生鼠标事件,也可能发生键盘事件,该Canvas对象就可以授权给事件处理者一来处理鼠标事件,同时授权给事件处理者二来处理键盘事件。

有时也将事件处理者称为监听器,主要原因也在于监听器时刻监听着事件源上所有发生的事件类型,一旦该事件类型与自己所负责处理的事件类型一致,就马上进行处理。

授权模型把事件的处理委托给外部的处理实体进行处理,实现了将事件源和监听器分开的机制。

事件处理者(监听器)通常是一个类,该类如果要能够处理某种类型的事件,就必须实现与该事件类型相对的接口。

例如例5.9中类ButtonHandler之所以能够处理ActionEvent事件,原因在于它实现了与ActionEvent事件对应的接口ActionListener。

每个事件类都有一个与之相对应的接口。

  将事件源对象和事件处理器(事件监听器)分开。

如图5.2所示

例5.9

    importjava.awt.*;

    importjava.awt.event.*;

    publicclassTestButton{

    publicstaticvoidmain(Stringargs[])

    {

      Framef=newFrame("Test");

      Buttonb=newButton("PressMe!

");

      b.addActionListener(newButtonHandler());/*注册监听器进行授权,该方法的参数是事件处理者对象,要处理的事件类型可以从方法名中看出,例如本方法要授权处理的是ActionEvent,因为方法名是addActionListener。

*/

      f.setLayout(newFlowLayout());//设置布局管理器

      f.add(b);

      f.setSize(200,100);

      f.setVisible(true);

    }

   }

  classButtonHandlerimplementsActionListener{

    //实现接口ActionListener才能做事件ActionEvent的处理者

    publicvoidactionPerformed(ActionEvente)

    //系统产生的ActionEvent事件对象被当作参数传递给该方法

    {

      System.out.println("Actionoccurred");

    //本接口只有一个方法,因此事件发生时,系统会自动调用本方法,需要做的操作就把代码写在则个方法里。

    }

    }

使用授权处理模型进行事件处理的一般方法归纳如下:

  1.对于某种类型的事件XXXEvent,要想接收并处理这类事件,必须定义相应的事件监听器类,该类需要实现与该事件相对应的接口XXXListener;

  2.事件源实例化以后,必须进行授权,注册该类事件的监听器,使用addXXXListener(XXXListener)方法来注册监听器。

5.2.1事件类

  与AWT有关的所有事件类都由java.awt.AWTEvent类派生,它也是EventObject类的子类。

AWT事件共有10类,可以归为两大类:

低级事件和高级事件。

java.util.EventObject类是所有事件对象的基础父类,所有事件都是由它派生出来的。

AWT的相关事件继承于java.awt.AWTEvent类,这些AWT事件分为两大类:

低级事件和高级事件,低级事件是指基于组件和容器的事件,当一个组件上发生事件,如:

鼠标的进入,点击,拖放等,或组件的窗口开关等,触发了组件事件。

高级事件是基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类,如在TextField中按Enter键会触发ActionEvent事件,滑动滚动条会触发AdjustmentEvent事件,或是选中项目列表的某一条就会触发ItemEvent事件。

  ◇低级事件

  ComponentEvent(组件事件:

组件尺寸的变化,移动)

  ContainerEvent(容器事件:

组件增加,移动)

  WindowEvent(窗口事件:

关闭窗口,窗口闭合,图标化)

  FocusEvent(焦点事件:

焦点的获得和丢失)

  KeyEvent(键盘事件:

键按下、释放)

  MouseEvent(鼠标事件:

鼠标单击,移动)

  ◇高级事件(语义事件)

  ActionEvent(动作事件:

按钮按下,TextField中按Enter键)

  AdjustmentEvent(调节事件:

在滚动条上移动滑块以调节数值)

  ItemEvent(项目事件:

选择项目,不选择"项目改变")

  TextEvent(文本事件,文本对象改变)

5.2.2事件监听器

  每类事件都有对应的事件监听器,监听器是接口,根据动作来定义方法。

AWT的组件类中提供注册和注销监听器的方法:

  ◇注册监听器:

  publicvoidaddlistener);

  ◇注销监听器:

  publicvoidremovelistener);

  例如Button类:

(查API)

  publicclassButtonextendsComponent{

     ……

     publicsynchronizedvoidaddActionListener(ActionListenerl);

     publicsynchronizedvoidremoveActionListener(ActionListenerl);

     ……}

5.2.3AWT事件及其相应的监听器接口

(1)

  表5.1列出了所有AWT事件及其相应的监听器接口,一共10类事件,11个接口。

下面这张表应能牢牢记住。

表5.1

事件类别

描述信息

接口名

方法

 ActionEvent

激活组件

  ActionListener

 actionPerformed(ActionEvent)

 ItemEvent

选择了某些项目

  ItemListener

 itemStateChanged(ItemEvent)

 MouseEvent

鼠标移动

  MouseMotionListener

 mouseDragged(MouseEvent)

 mouseMoved(MouseEvent)

鼠标点击等

  MouseListener

 mousePressed(MouseEvent)

 mouseReleased(MouseEvent)

 mouseEntered(MouseEvent)

 mouseExited(MouseEvent)

 mouseClicked(MouseEvent)

 KeyEvent

键盘输入

  KeyListener

 keyPressed(KeyEvent)

 keyReleased(KeyEvent)

 keyTyped(KeyEvent)

 FocusEvent

组件收到或失去焦点

  FocusListener

 focusGained(FocusEvent)

 focusLost(FocusEvent)

 AdjustmentEvent

移动了滚动条等组件

  AdjustmentListener

 adjustmentValueChanged(AdjustmentEvent)

 ComponentEvent

对象移动缩放显示隐藏等

  ComponentListener

 componentMoved(ComponentEvent)

 componentHidden(ComponentEvent)

 componentResized(ComponentEvent)

 componentShown(ComponentEvent)

 WindowEvent

窗口收到窗口级事件

  WindowListener

 windowClosing(WindowEvent)

 windowOpened(WindowEvent)

 windowIconified(WindowEvent)

 windowDeiconified(WindowEvent)

 windowClosed(WindowEvent)

 windowActivated(WindowEvent)

 windowDeactivated(WindowEvent)

 ContainerEvent

容器中增加删除了组件

  ContainerListener

 componentAdded(ContainerEvent)

 componentRemoved(ContainerEvent)

 TextEvent

文本字段或文本区发生改变

  TextListener

 textValueChanged(TextEvent)

5.2.3AWT事件及其相应的监听器接口

(2)

1.可以声明多个接口,接口之间用逗号隔开。

    ……implementsMouseMotionListener,MouseListener,WindowListener;

2.可以由同一个对象监听一个事件源上发生的多种事件:

  f.addMouseMotionListener(this);

  f.addMouseListener(this);

  f.addWindowListener(this);

  则对象f上发生的多个事件都将被同一个监听器接收

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1