第16讲图形用户界面二课件_第1页
第16讲图形用户界面二课件_第2页
第16讲图形用户界面二课件_第3页
第16讲图形用户界面二课件_第4页
第16讲图形用户界面二课件_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第16讲图形用户界面㈡布局管理器事件驱动设计AWT高级组件(一)/第16讲图形用户界面㈡布局管理器/1教学目标掌握布局管理器的使用理解事件驱动机制掌握事件驱动设计方法掌握AWT高级组件的应用教学目标掌握布局管理器的使用2布局管理器在前面课程的学习中,经常会发生这样的情况,当将很多的组件放在容器里面的时候,这些组件摆放将很凌乱,有时候甚至看不见部分组件。这是因为没有对这些组件进行布局管理。AWT提供了5个类来对容器页面进行管理,它们均直接继承自java.lang.Object类。FlowLayout(流式布局)BorderLayout(边界布局)GridLayout(网格布局)CardLayout(多层/卡片布局)GridBagLayout(动态网格布局)布局管理器在前面课程的学习中,经常会发生这样的情况,当将3布局管理器-FlowLayoutFlowLayout是Applet和Panel容器的默认布局管理器,它按照从上到下、从左到右的规则,将添加到容器中的组件依次排列,默认情况下每行组件均居中排列。自动调用组件的getPreferredSize()方法,使用组件的最佳尺寸来显示组件。FlowLayout的构造函数:FlowLayout():居中对齐方式,组件间的水平和竖直间距为缺省值5个象素。FlowLayout(intalignment):可以设定每一行组件的对齐方式FlowLayout(intalignment,inthorz,intvert):可以设定组件间的水平和垂直距离布局管理器-FlowLayoutFlowLayout是4importjava.awt.*;publicclassEx9_9{

publicstaticvoidmain(Stringargs[]){ Framefrm=newFrame("FlowLayout演示窗口"); Buttonbut1,but2,but3,but4,but5; but1=newButton(“按钮一”);

but2=newButton("按钮二"); but3=newButton(“按钮三”);

but4=newButton("按钮四"); but5=newButton("按钮五");

//设置FlowLayout布局,并且组件左对齐

frm.setLayout(newFlowLayout(FlowLayout.LEFT)); frm.add(but1); //把五个按钮加入容器中

frm.add(but2); frm.add(but3); frm.add(but4); frm.add(but5); frm.setSize(200,100); frm.setLocation(100,100); frm.setVisible(true);}} 程序分析:程序运行结果如图所示。当拖动窗口的边界改变窗口大小时,将会发现窗口里面的组件也随着窗口大小而改变位置,组建的布局就像流动式的一样,这就是FlowLayout布局的特点。FlowLayout示例importjava.awt.*;程序分析:程序运行结果如5布局管理器-BorderLayoutBorderLayout是Windows及其子类Frame的默认布局管理器,它将容器分为5个部分,分别命名为NORTH、SOUTH、WEST、EAST和CENTER。下面是BorderLayout所定义的构造函数:BorderLayout():生成默认的边界布局BorderLayout(inthorz,intvert):设定组件间的水平和垂直距离用add()方法往容器中添加组件时必须指明添加的位置,若没有指明放置位置,则表明为默认的“Center”方位。若每个区域或若干个区域没有放置组件,东西南北区域将不会有预留,而中间区域将置空。add(“North”,newButton(“North”));add(newButton(“West”),BorderLayout.SOUTH);布局管理器-BorderLayoutBorderLay6importjava.awt.*;publicclassEx9_10{

publicstaticvoidmain(Stringargs[]) { Framefrm=newFrame("BorderLayout演示窗口"); BorderLayoutborder=newBorderLayout(2,5); Buttonbut1,but2,but3,but4,but5; but1=newButton("按钮东"); but2=newButton("按钮南"); but3=newButton("按钮西"); but4=newButton("按钮北"); but5=newButton("按钮中"); frm.setLayout(border); frm.add(but1,border.EAST);

frm.add(but2,border.SOUTH); frm.add(but3,border.WEST);

frm.add(but4,border.NORTH); frm.add(but5,border.CENTER); frm.setSize(200,150); frm.setLocation(100,100); frm.setVisible(true);

}} 程序分析:运行程序,将看到如图的图形。如果容器使用BorderLayout类对象作为布局管理器,添加任何一个组件都将以边界作为参照。比如,frm.add(but1,border.EAST);就是在容器frm的最左端添加一个组件but1。BorderLayout示例说明:每个区域只能添加一个组件,若添加多个,则只能显示一个组件。如果想在一个区域添加多个组件,则必须先在该区域放一个Panel容器,再将多个组件放在该Panel容器中。importjava.awt.*;程序分析:运行程序,将看7布局管理器-GridLayoutGridLayout是一种很容易理解的布局管理器,它将容器按照指定的行数、列数分成大小均匀的网格,然后将添加到容器里面的组件一一放入。GridLayout的构造函数如下所示:GridLayout():生成一个单列的网格布局GridLayout(introw,intcol):生成一个设定行数和列数的网格布局GridLayout(introw,intcol,inthorz,intvert):可以设置组件之间的水平和垂直间隔布局管理器-GridLayoutGridLayout8importjava.awt.*;publicclassEx9_11{publicstaticvoidmain(Stringargs[]){Framefrm=newFrame("GridLayout演示窗口");GridLayoutgrid=newGridLayout(3,4);frm.setLayout(grid);for(inti=1;i<=12;i++)frm.add(newButton(Integer.toString(i)));frm.setSize(200,150);frm.setVisible(true);}}程序分析:由于使用GridLayout布局管理器布局的容器里面添加的组件大小完全相同,所以经常将界面中具有这些规则的组件放入一个新的容器里面,使用GridLayout进行布局,然后再将这个容器添加到界面容器里面。GridLayout示例importjava.awt.*;程序分析:由于使用Gri9布局管理器-CardLayoutCardLayout是一种将每个组件看作一张卡片,且将所有卡片码成一摞,每一时刻只有一张卡片被显示的布局管理器。有人将其形象地描述为一副落成一叠的扑克牌。第一个添加到容器中的组件位于最低层,最后一个添加到容器中的组件位于最上层。请参考API文档熟悉CardLayout类的构造方法和常用方法。布局管理器-CardLayoutCardLayout是10布局管理器-GridBagLayoutGridBagLayout生成的布局管理器也是和GridLayout一样是使用网格来进行布局管理的。所不同之处在于GridBagLayout可以通过类GridBagConstraints来控制布局容器内各组件的大小,每个组件都使用一个GridBageConstraints对象来给出它的大小和摆放位置,这样就可以按照设计者的意图,改变组件的大小,把它们摆在设计者希望摆放的位置上。这种灵活性是前面几个布局管理器所不具备的。有关GridBageLayout布局管理器使用的详细情况参阅API文档。布局管理器-GridBagLayoutGridBagL11容器的嵌套实际应用中,可能将整个窗口分成很多小块,每一块包含几个组件,这些组件用一个容器来存放,然后再将这些小块容器添加到窗口对象中。AWT就提供了另外一个容器类Panel。可以在一个容器中添加几个Panel容器对象,每个Panel容器对象都可以指定不同的布局方式。容器的嵌套实际应用中,可能将整个窗口分成很多小块,每一块包12importjava.awt.*;publicclassEx9_12{

publicstaticvoidmain(Stringargs[]) { Framefrm=newFrame("容器的嵌套"); Labellab=newLabel("0.",Label.RIGHT); frm.setLayout(null); Panelpnl=newPanel(); GridLayoutgrid=newGridLayout(4,4); pnl.setLayout(grid); Strings[]={"7","8","9","/","4","5","6","*","1","2","3","-","0",".","=","+"}; for(inti=0;i<16;i++)

pnl.add(newButton(s[i])); lab.setBackground(Color.orange); lab.setBounds(20,30,160,20); pnl.setBounds(20,60,160,80); frm.add(lab); frm.add(pnl); frm.setSize(200,150); frm.setVisible(true); }} 程序分析:程序中,将大小相同的12个按钮组件添加在一个Panel对象里面,使用GridLayout进行布局,然后再将这个Panel对象添加到顶层容器Frame对象中。Panel示例importjava.awt.*;程序分析:程序中,将大小13事件驱动设计事件驱动设计14事件驱动设计在窗口程序设计里,事件(event)的设计是不可或缺的一块。当按下按钮时,也就触发了“按钮被按”的事件,至于计算机要做什么样的反应,则是由程序代码来做判断与决定的。前面已经学会来怎样去绘制一个图形用户界面,但是还没有编写用户交互的代码。下面来认识一下Java的事件处理机制。每发生一个事件,程序都需要作出相应的响应,这称为事件处理。事件驱动设计在窗口程序设计里,事件(event)的设计是不15委派事件模型事件处理机制的思想是:可能产生事件的对象(事件源,如窗口,按钮等)收到用户发出的操作指令后产生相应的事件,然后将这些事件分别发送给不同的监听器,由监听器来处理这些事件,并将处理结果返回。整个过程中,监听器简单的等待,直到它收到一个事件。这种事件处理机制使得处理事件的应用程序逻辑与生成那些事件的界面逻辑(容器或者组件)彼此分离,相互独立存在。委派事件模型事件处理机制的思想是:可能产生事件的对象(事件16importjava.awt.*;importjava.awt.event.*;classEx9_13extendsFrameimplementsActionListener{

staticEx9_13frm=newEx9_13();

staticButtonbtn=newButton("将窗口变成黄色");

publicstaticvoidmain(Stringargs[]){

btn.addActionListener(frm);//把frm向btn注册,让frm监听事件

frm.setLayout(newFlowLayout()); frm.setTitle("ActionEvent"); frm.setSize(200,150); frm.add(btn); frm.setVisible(true); }

publicvoidactionPerformed(ActionEvente){ frm.setBackground(Color.yellow);

}}程序分析:事件源:也就是事件发生的场所,通常就是各个组件。如本例的按钮对象。事件:用户对界面操作在Java语言上的描述。它由用户和界面中的组件交换而产生,比如移动鼠标、点击鼠标按钮和按下键盘键等都可以引发事件。本例中,当按下按钮时,就产生了一个事件ActionEvent。监听:Java使用一组接口来实现对事件源的监听。本例中,为了使frm窗口对象能够监听按钮触发的事件,让Ex9_13对象实现事件处理的接口。自身实现监听器示例importjava.awt.*;程序分析:自身实现监听器17importjava.awt.*;importjava.awt.event.*;classEx9_14{

staticFramefrm=newFrame("ActionEvent");

staticButtonbtn=newButton("将窗口变成黄色");

publicstaticvoidmain(Stringargs[]){ btn.addActionListener(newActLis()); frm.setLayout(newFlowLayout()); frm.setTitle("ActionEvent"); frm.setSize(200,150); frm.add(btn); frm.setVisible(true);

} //定义内部类ActLis,并实现ActionListener接口

staticclassActLisimplementsActionListener{ publicvoidactionPerformed(ActionEvente){//事件发生的处理操作

frm.setBackground(Color.yellow); }

}}程序分析:上个例子中,选择了窗口作为监听者。事实上也可以自定义一个类来实现ActionListener接口,再把此类产生的对象作为监听。通常把实现接口的类定义在主类里,自己成为它的内部类。内部类实现监听器示例importjava.awt.*;程序分析:内部类实现监听18事件处理类Java把事件类大致分成两种:语义事件(semanticevents)与底层事件(low-leverevents)(指屏幕上可视化组件的低级输入或窗口系统事件)。其中语义事件直接继承自AWTEvent,如ActionEvent、AdjustmentEvent与ComponentEvent等等,底层事件则是继承自ComponentEvent类,如ContainerEvent、FocusEvent、WindowEvent与KeyEvent等等。下表提供了常用的事件类、事件监听接口与事件监听接口提供的方法。事件处理类Java把事件类大致分成两种:语义事件(seman19ActionEvent事件类的处理ActionEvent事件对应于组件的主要用途。点击按钮,选择菜单项目,或向单行文本框输入字符串并敲击Enter键时,都会发生ActionEvent事件。例:Ex9_15程序分析:点击前面两个按钮,文本框将显示相应的信息,点击退出按钮,程序将结束。类Ex9_15继承自Frame,frm对象是按钮组件的容器。当按下按钮时,将会发生ActionEvent类事件,按钮本身不作任何处理,这时候就会把事件向上传递,直到窗口对象frm监听为止。当frm对象监听到按钮事件后,就会运行ActionListener接口提供的方法actionPerformed(ActionEvente)。由于ActionEvent类继承自EventObject类,所以可以使用EventObject类提供的方法getSource()来查看是哪个对象激活的事件。ActionEvent事件类的处理ActionEvent事20TextEvent类文本事件是指当窗口中TextField或TextArea组件里的文本改变时所触发的事件。Java用TextEvent类来处理这个事件,而TextListener则为监听TextEvent事件的接口,该接口声明了textValueChanged()方法:publicvoidtextValueChanged(TextEvente)当TextEvent事件发生时,textValueChanged()就会执行。Ex9_16程序分析:当在文本框输入文字时,textValueChanged()方法将会执行,两个标签分别显示文本框的内容和文本的长度。程序中在类Ex9_16里面定义了一个内部类TextHandler,由TextListener接口实现。文本框组件tf向内部类对象注册监听。TextEvent类文本事件是指当窗口中TextField21KeyEvent类KeyEvent类继承自InputEvent类,是属于低层次的事件类,只要在键盘上按下任何键,都会触发按键事件。要处理KeyEvent事件,可以用KeyListener接口来承担监听。Ex9_17但是KeyListener接口提供的事件处理方法较多,在实现的类里针对每一个方法都要编写处理代码。即使没有作相关的处理,也必须要把这些方法都写上去,所以用起来有点不方便。除了KeyListener之外,AWT还提供了KeyAdapter类来处理KeyEvent事件。Ex9_18程序分析:程序中类Ex9_17用KeyListener接口处理KeyEvent事件,必须用类实现KeyListener接口,然后用这个类对象来监听KeyEvent事件。当在文本框按键时,KeyEvent事件将被触发,frm对象监听到之后,KeyListener接口定义的三个方法将会执行。程序中类Ex9_18里面定义了一个内部类KeyLis,然后用这个内部类的对象去监听KeyEvent事件。在内部类KeyLis中,定义了方法keyTyped()方法,这个方法覆盖了父类KeyAdapter类中的方法keyTyped()。KeyEvent类KeyEvent类继承自InputEve22MouseEvent类鼠标事件类MouseEvent也继承自InputEvent类,属于低层次事件类的一种,只要鼠标的按钮按下、鼠标指针进入或移出事件源、移动鼠标、拖拽鼠标,都会触发鼠标事件。同KeyEvent事件一样,可以使用多种方法来处理MouseEvent事件。AWT提供了MouseListener接口和MouseMotionListener接口作为MouseEvent事件的监听。为了方便操作,还提供了MouseAdapter类和MouseMotionAdapter类来处理MouseEvent事件,它们分别用MouseListener接口和MouseMotionListener接口进行定义。MouseEvent类鼠标事件类MouseEvent也继承23MouseEvent类1.用MouseListener接口来处理MouseEvent事件例:Ex9_192.用MouseMotionListener接口来处理MouseEvent事件例:Ex9_203.用MouseAdapter类事件处理MouseEvent事件例:Ex9_21MouseEvent类1.用MouseListener接24WindowEvent类低层次事件类。窗口的创建、缩小、关闭、变成非活动窗口等操作都会触发WindowEvent事件。AWT提供了WindowListerner接口用于窗口事件的监听。为了简便操作,提供了WindowAdapter类来处理WindowEvent事件。WindowListerner接口中声明了7个方法。方法主要功能voidwindowActivated(WindowEvente)将Window设置为活动Window时调用voidwindowClosed(WindowEvente)因对窗口调用dispose而将其关闭时调用WindowEvent类低层次事件类。窗口的创建、缩小、关25方法主要功能voidwindowClosing(WindowEvente)用户试图从窗口的系统菜单中关闭窗口时调用voidwindowDeactivated(WindowEvente)当Window不再是活动Window时调用voidwindowDeiconified(WindowEvente)窗口从最小化状态变为正常状态时调用voidwindowIconified(WindowEvente)窗口从正常状态变为最小化状态时调用voidwindowOpened(WindowEvente)窗口首次变为可见时调用例:Ex9_22方法主要功能voidwindowClosing26AWT高级组件AWT高级组件27文本框列表List提供一个可以滚动的文本项列表,用户可以选择一个或者多个选项。方法主要功能List()创建新的滚动列表List(introws)创建一个用指定可视行数初始化的新滚动列表List(introws,booleanmultipleMode)创建一个初始化为显示指定行数的新滚动列表voidadd(Stringitem)向滚动列表的末尾添加指定的项voidadd(Stringitem,intindex)向滚动列表中索引指示的位置添加指定的项文本框列表List提供一个可以滚动的文本项列表,用户可以选择28方法主要功能voidaddItemListener(ItemListenerl)添加指定的项侦听器以接收此列表的项事件voidaddNotify()创建列表的同位体voiddeselect(intindex)取消选择指定索引处的项StringgetItem(intindex)获取与指定索引关联的项intgetItemCount()获取列表中的项数intgetRows()获取此列表中的可视行数intgetSelectedIndex()获取列表中选中项的索引StringgetSelectedItem()获取此滚动列表中选中的项String[]getSelectedItems()获取此滚动列表中选中的项booleanisMultipleMode()确定此列表是否允许多项选择voidremove(intposition)从此滚动列表中移除指定位置处的项voidremoveAll()从此列表中移除所有项方法主要功能voidaddItemList29List组件使用当用户选取或者取消选取文本框列表中的某个选项时,ItemEvent事件就会被触发。可以使用addItemListener()方法把事件监听向List类的对象注册,再将事件处理的程序代码编写在itemStateChanged()方法里。例:Ex9_23程序分析:当选择某一选项时,窗口中的标签颜色将相应产生变化。本例中,类Ex9_23由接口ItemListener实现,所以Ex9_23类对象frm就可以用来监听ItemEvent事件。当用户选择某一个选项时,ItemE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论