1、1/第16讲 图形用户界面c布局管理器c事件驱动设计cAWT高级组件(一)教学目标 掌握布局管理器的使用 理解事件驱动机制 掌握事件驱动设计方法 掌握AWT高级组件的应用 布局管理器 在前面课程的学习中,经常会发生这样的情况,当将很多的组件放在容器里面的时候,这些组件摆放将很凌乱,有时候甚至看不见部分组件。这是因为没有对这些组件进行布局管理。AWT提供了5个类来对容器页面进行管理,它们均直接继承自java.lang.Object类。-FlowLayout(流式布局)-BorderLayout(边界布局)-GridLayout(网格布局)-CardLayout(多层/卡片布局)-GridBagL
2、ayout(动态网格布局)布局管理器-FlowLayout FlowLayout是Applet和Panel容器的默认布局管理器,它按照从上到下、从左到右的规则,将添加到容器中的组件依次排列,默认情况下每行组件均居中排列。自动调用组件的getPreferredSize()方法,使用组件的最佳最佳尺寸尺寸来显示组件。FlowLayout的构造函数:uFlowLayout():居中对齐方式,组件间的水平和竖直间距为缺省值5个象素。uFlowLayout(int alignment):可以设定每一行组件的对齐方式 uFlowLayout(int alignment,int horz,int vert)
3、:可以设定组件间的水平和垂直距离import java.awt.*;public class Ex9_9public static void main(String args)Frame frm=new Frame(FlowLayout演示窗口);Button but1,but2,but3,but4,but5;but1=new Button(“按钮一”);but2=new Button(按钮二);but3=new Button(“按钮三”);but4=new Button(按钮四);but5=new Button(按钮五);/设置FlowLayout布局,并且组件左对齐frm.setLayou
4、t(new FlowLayout(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示例 布局管理器-BorderLay
5、out BorderLayout是Windows及其子类Frame的默认布局管理器,它将容器分为5个部分,分别命名为NORTH、SOUTH、WEST、EAST和CENTER。下面是BorderLayout所定义的构造函数:uBorderLayout():生成默认的边界布局uBorderLayout(int horz,int vert):设定组件间的水平和垂直距离 用add()方法往容器中添加组件时必须指明添加的位置,若没有指明放置位置,则表明为默认的“Center”方位。若每个区域或若干个区域没有放置组件,东西南北区域将不会有预留,而中间区域将置空。add(“North”,new Button
6、(“North”);add(new Button(“West”),BorderLayout.SOUTH);import java.awt.*;public class Ex9_10public static void main(String args)Frame frm=new Frame(BorderLayout演示窗口);BorderLayout border=new BorderLayout(2,5);Button but1,but2,but3,but4,but5;but1=new Button(按钮东);but2=new Button(按钮南);but3=new Button(按钮西)
7、;but4=new Button(按钮北);but5=new Button(按钮中);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);程序分析:运行程序,将看到如图的图形。如果容器使用BorderLay
8、out类对象作为布局管理器,添加任何一个组件都将以边界作为参照。比如,frm.add(but1,border.EAST);就是在容器frm的最左端添加一个组件but1。BorderLayout示例说明:每个区域只能添加一个组件,若添加多个,则只能显示一个组件。如果想在一个区域添加多个组件,则必须先在该区域放一个Panel容器,再将多个组件放在该Panel容器中。布局管理器-GridLayout GridLayout是一种很容易理解的布局管理器,它将容器按照指定的行数、列数分成大小均匀的网格,然后将添加到容器里面的组件一一放入。nGridLayout的构造函数如下所示:uGridLayout()
9、:生成一个单列的网格布局uGridLayout(int row,int col):生成一个设定行数和列数的网格布局uGridLayout(int row,int col,int horz,int vert):可以设置组件之间的水平和垂直间隔import java.awt.*;public class Ex9_11 public static void main(String args)Frame frm=new Frame(GridLayout演示窗口);GridLayout grid=new GridLayout(3,4);frm.setLayout(grid);for(int i=1;i=
10、12;i+)frm.add(new Button(Integer.toString(i);frm.setSize(200,150);frm.setVisible(true);程序分析:由于使用GridLayout布局管理器布局的容器里面添加的组件大小完全相同,所以经常将界面中具有这些规则的组件放入一个新的容器里面,使用GridLayout进行布局,然后再将这个容器添加到界面容器里面。GridLayout示例 布局管理器-CardLayout CardLayout是一种将每个组件看作一张卡片,且将所有卡片码成一摞,每一时刻只有一张卡片被显示的布局管理器。有人将其形象地描述为一副落成一叠的扑克牌。
11、第一个添加到容器中的组件位于最低层,最后一个添加到容器中的组件位于最上层。请参考API文档熟悉CardLayout类的构造方法和常用方法。布局管理器-GridBagLayout GridBagLayout生成的布局管理器也是和GridLayout一样是使用网格来进行布局管理的。所不同之处在于GridBagLayout可以通过类GridBagConstraints来控制布局容器内各组件的大小,每个组件都使用一个GridBageConstraints对象来给出它的大小和摆放位置,这样就可以按照设计者的意图,改变组件的大小,把它们摆在设计者希望摆放的位置上。这种灵活性是前面几个布局管理器所不具备的。
12、有关GridBageLayout布局管理器使用的详细情况参阅API文档。容器的嵌套 实际应用中,可能将整个窗口分成很多小块,每一块包含几个组件,这些组件用一个容器来存放,然后再将这些小块容器添加到窗口对象中。AWT就提供了另外一个容器类Panel。可以在一个容器中添加几个Panel容器对象,每个Panel容器对象都可以指定不同的布局方式。import java.awt.*;public class Ex9_12public static void main(String args)Frame frm=new Frame(容器的嵌套);Label lab=new Label(0.,Label.R
13、IGHT);frm.setLayout(null);Panel pnl=new Panel();GridLayout grid=new GridLayout(4,4);pnl.setLayout(grid);String s=7,8,9,/,4,5,6,*,1,2,3,-,0,.,=,+;for(int i=0;i16;i+)pnl.add(new Button(si);lab.setBackground(Color.orange);lab.setBounds(20,30,160,20);pnl.setBounds(20,60,160,80);frm.add(lab);frm.add(pnl)
14、;frm.setSize(200,150);frm.setVisible(true);程序分析:程序中,将大小相同的12个按钮组件添加在一个Panel对象里面,使用GridLayout进行布局,然后再将这个Panel对象添加到顶层容器Frame对象中。Panel示例事件驱动设计事件驱动设计 在窗口程序设计里,事件(event)的设计是不可或缺的一块。当按下按钮时,也就触发了“按钮被按”的事件,至于计算机要做什么样的反应,则是由程序代码来做判断与决定的。前面已经学会来怎样去绘制一个图形用户界面,但是还没有编写用户交互的代码。下面来认识一下Java的事件处理机制。每发生一个事件,程序都需要作出相应
15、的响应,这称为事件处理。委派事件模型 事件处理机制的思想是:可能产生事件的对象(事件源,如窗口,按钮等)收到用户发出的操作指令后产生相应的事件,然后将这些事件分别发送给不同的监听器,由监听器来处理这些事件,并将处理结果返回。整个过程中,监听器简单的等待,直到它收到一个事件。这种事件处理机制使得处理事件的应用程序逻辑与生成那些事件的界面逻辑(容器或者组件)彼此分离,相互独立存在。import java.awt.*;import java.awt.event.*;class Ex9_13 extends Frame implements ActionListenerstatic Ex9_13 fr
16、m=new Ex9_13();static Button btn=new Button(将窗口变成黄色);public static void main(String args)btn.addActionListener(frm);/把frm向btn注册,让frm监听事件frm.setLayout(new FlowLayout();frm.setTitle(Action Event);frm.setSize(200,150);frm.add(btn);frm.setVisible(true);public void actionPerformed(ActionEvent e)frm.setBa
17、ckground(Color.yellow);程序分析:程序分析:事件源:也就是事件发生的场所,通常就是各个组件。如本事件源:也就是事件发生的场所,通常就是各个组件。如本例的按钮对象。例的按钮对象。事件:用户对界面操作在事件:用户对界面操作在Java语言上的描述。它由用户和界语言上的描述。它由用户和界面中的组件交换而产生,比如移动鼠标、点击鼠标按钮和按下面中的组件交换而产生,比如移动鼠标、点击鼠标按钮和按下键盘键等都可以引发事件。本例中,当按下按钮时,就产生了键盘键等都可以引发事件。本例中,当按下按钮时,就产生了一个事件一个事件ActionEvent。监听:监听:Java使用一组接口来实现对事
18、件源的监听。本例中,使用一组接口来实现对事件源的监听。本例中,为了使为了使frm窗口对象能够监听按钮触发的事件,让窗口对象能够监听按钮触发的事件,让Ex9_13对象对象实现事件处理的接口。实现事件处理的接口。自身实现监听器示例import java.awt.*;import java.awt.event.*;class Ex9_14static Frame frm=new Frame(Action Event);static Button btn=new Button(将窗口变成黄色);public static void main(String args)btn.addActionListe
19、ner(new ActLis();frm.setLayout(new FlowLayout();frm.setTitle(Action Event);frm.setSize(200,150);frm.add(btn);frm.setVisible(true);/定义内部类ActLis,并实现ActionListener接口static class ActLis implements ActionListenerpublic void actionPerformed(ActionEvent e)/事件发生的处理操作frm.setBackground(Color.yellow);程序分析:程序分析
20、:上个例子中,选择了窗口作为监听者。事实上也可以自定上个例子中,选择了窗口作为监听者。事实上也可以自定义一个类来实现义一个类来实现ActionListener接口,再把此类产生的对象作接口,再把此类产生的对象作为监听。通常把实现接口的类定义在主类里,自己成为它的为监听。通常把实现接口的类定义在主类里,自己成为它的内部类。内部类。内部类实现监听器示例事件处理类 Java把事件类大致分成两种:语义事件(semantic events)与底层事件(low-lever events)(指屏幕上可视化组件的低级输入或窗口系统事件)。其中语义事件直接继承自AWTEvent,如ActionEvent、Adj
21、ustmentEvent与ComponentEvent等等,底层事件则是继承自ComponentEvent类,如ContainerEvent、FocusEvent、WindowEvent与KeyEvent等等。下表提供了常用的事件类、事件监听接口与事件监听接口提供的方法。ActionEvent事件类的处理 ActionEvent事件对应于组件的主要用途。点击按钮,选择菜单项目,或向单行文本框输入字符串并敲击Enter键时,都会发生ActionEvent事件。例:Ex9_15程序分析:点击前面两个按钮,文本框将显示相应的信息,点击退出按钮,程序将结束。类Ex9_15继承自Frame,frm对象是
22、按钮组件的容器。当按下按钮时,将会发生ActionEvent类事件,按钮本身不作任何处理,这时候就会把事件向上传递,直到窗口对象frm监听为止。当frm对象监听到按钮事件后,就会运行ActionListener接口提供的方法actionPerformed(ActionEvent e)。由于ActionEvent类继承自EventObject类,所以可以使用EventObject类提供的方法getSource()来查看是哪个对象激活的事件。TextEvent类 文本事件是指当窗口中TextField或TextArea组件里的文本改变时所触发的事件。Java用TextEvent类来处理这个事件,而
23、TextListener则为监听TextEvent事件的接口,该接口声明了textValueChanged()方法:public void textValueChanged(TextEvent e)当TextEvent事件发生时,textValueChanged()就会执行。Ex9_16程序分析:当在文本框输入文字时,textValueChanged()方法将会执行,两个标签分别显示文本框的内容和文本的长度。程序中在类Ex9_16里面定义了一个内部类TextHandler,由TextListener接口实现。文本框组件tf向内部类对象注册监听。KeyEvent类 KeyEvent类继承自Inp
24、utEvent类,是属于低层次的事件类,只要在键盘上按下任何键,都会触发按键事件。要处理KeyEvent事件,可以用KeyListener接口来承担监听。Ex9_17 但是KeyListener接口提供的事件处理方法较多,在实现的类里针对每一个方法都要编写处理代码。即使没有作相关的处理,也必须要把这些方法都写上去,所以用起来有点不方便。除了KeyListener之外,AWT还提供了KeyAdapter类来处理KeyEvent事件。Ex9_18程序分析:程序中类Ex9_17用KeyListener接口处理KeyEvent事件,必须用类实现KeyListener接口,然后用这个类对象来监听KeyE
25、vent事件。当在文本框按键时,KeyEvent事件将被触发,frm对象监听到之后,KeyListener接口定义的三个方法将会执行。程序中类Ex9_18里面定义了一个内部类KeyLis,然后用这个内部类的对象去监听KeyEvent事件。在内部类KeyLis中,定义了方法keyTyped()方法,这个方法覆盖了父类KeyAdapter类中的方法keyTyped()。MouseEvent类 鼠标事件类MouseEvent也继承自InputEvent类,属于低层次事件类的一种,只要鼠标的按钮按下、鼠标指针进入或移出事件源、移动鼠标、拖拽鼠标,都会触发鼠标事件。同KeyEvent事件一样,可以使用多
26、种方法来处理MouseEvent事件。AWT提供了MouseListener接口和MouseMotionListener接口作为MouseEvent事件的监听。为了方便操作,还提供了MouseAdapter类和MouseMotionAdapter类来处理MouseEvent事件,它们分别用MouseListener接口和MouseMotionListener接口进行定义。MouseEvent类 1用用MouseListener接口来处理接口来处理MouseEvent事件事件例:例:Ex9_19 2用用MouseMotionListener接口来处理接口来处理MouseEvent事件事件例:例:
27、Ex9_20 3用用MouseAdapter类事件处理类事件处理MouseEvent事件事件例:例:Ex9_21WindowEvent类 低层次事件类。窗口的创建、缩小、关闭、变成非活动窗口等操作都会触发WindowEvent事件。AWT提供了WindowListerner接口用于窗口事件的监听。为了简便操作,提供了WindowAdapter类来处理WindowEvent事件。WindowListerner接口中声明了7个方法。方方 法法主主 要要 功功 能能void windowActivated(WindowEvent e)将将 Window Window 设置为活动设置为活动 Windo
28、w Window 时调用时调用void windowClosed(WindowEvent e)因对窗口调用因对窗口调用 dispose dispose 而将其而将其关闭时调用关闭时调用方方 法法主主 要要 功功 能能void windowClosing(WindowEvent e)用户试图从窗口的系统菜单中关用户试图从窗口的系统菜单中关闭窗口时调用闭窗口时调用void windowDeactivated(WindowEvent e)当当 Window Window 不再是活动不再是活动 Window Window 时调用时调用void windowDeiconified(WindowEvent
29、 e)窗口从最小化状态变为正常状态窗口从最小化状态变为正常状态时调用时调用void windowIconified(WindowEvent e)窗口从正常状态变为最小化状态窗口从正常状态变为最小化状态时调用时调用void windowOpened(WindowEvent e)窗口首次变为可见时调用窗口首次变为可见时调用例:例:Ex9_22AWT高级组件 文本框列表List 提供一个可以滚动的文本项列表,用户可以选择一个或者多个选项。方方 法法主主 要要 功功 能能List()创建新的滚动列表创建新的滚动列表List(int rows)创建一个用指定可视行数初始化的新滚创建一个用指定可视行数初始
30、化的新滚动列表动列表List(int rows,boolean multipleMode)创建一个初始化为显示指定行数的新滚创建一个初始化为显示指定行数的新滚动列表动列表void add(String item)向滚动列表的末尾添加指定的项向滚动列表的末尾添加指定的项void add(String item,int index)向滚动列表中索引指示的位置添加指定向滚动列表中索引指示的位置添加指定的项的项方方 法法主主 要要 功功 能能void addItemListener(ItemListener l)添加指定的项侦听器以接收此列表的添加指定的项侦听器以接收此列表的项事件项事件void ad
31、dNotify()创建列表的同位体创建列表的同位体void deselect(int index)取消选择指定索引处的项取消选择指定索引处的项String getItem(int index)获取与指定索引关联的项获取与指定索引关联的项int getItemCount()获取列表中的项数获取列表中的项数int getRows()获取此列表中的可视行数获取此列表中的可视行数int getSelectedIndex()获取列表中选中项的索引获取列表中选中项的索引String getSelectedItem()获取此滚动列表中选中的项获取此滚动列表中选中的项String getSelectedIte
32、ms()获取此滚动列表中选中的项获取此滚动列表中选中的项boolean isMultipleMode()确定此列表是否允许多项选择确定此列表是否允许多项选择void remove(int position)从此滚动列表中移除指定位置处的项从此滚动列表中移除指定位置处的项void removeAll()从此列表中移除所有项从此列表中移除所有项List组件使用 当用户选取或者取消选取文本框列表中的某个选项时,ItemEvent事件就会被触发。可以使用addItemListener()方法把事件监听向List类的对象注册,再将事件处理的程序代码编写在itemStateChanged()方法里。例:E
33、x9_23程序分析:当选择某一选项时,窗口中的标签颜色将相应产生变化。本例中,类Ex9_23由接口ItemListener实现,所以Ex9_23类对象frm就可以用来监听ItemEvent事件。当用户选择某一个选项时,ItemEvent事件e将被触发,相应的itemStateChanged()方法就会执行。使用List类对象的getSelectedIndex()方法获取哪个选项被选中,根据返回值设置窗口中标签对象的前景色。下拉菜单Choice 与List组件类似,提供了多个选项供用户选择。不同处u只能选择单一项目,不能复选u只能显示一个选项。方方 法法主主 要要 功功 能能Choice()创建
34、一个新的选择菜单创建一个新的选择菜单void add(String item)将一个项添加到此将一个项添加到此 Choice Choice 菜单中菜单中void addItemListener(ItemListener l)添加指定的项侦听器,以接收来自添加指定的项侦听器,以接收来自此此 Choice Choice 菜单的项事件菜单的项事件方方 法法主主 要要 功功 能能String getItem(int index)获得此获得此 Choice Choice 菜单中指定索引上菜单中指定索引上的字符串的字符串int getItemCount()返回此返回此 Choice Choice 菜单中项
35、的数量菜单中项的数量int getSelectedIndex()返回当前选定项的索引返回当前选定项的索引String getSelectedItem()获得当前选择的字符串表示形式获得当前选择的字符串表示形式void insert(String item,int index)将菜单项插入此选择的指定位置上将菜单项插入此选择的指定位置上void remove(int position)从选择菜单的指定位置上移除一个从选择菜单的指定位置上移除一个项项void removeAll()从选择菜单中移除所有的项从选择菜单中移除所有的项void select(int pos)将此将此 Choice Cho
36、ice 菜单中的选定项设置菜单中的选定项设置为指定位置上的项为指定位置上的项void select(String str)将此将此 Choice Choice 菜单中的选定项设置菜单中的选定项设置为其名称等于指定字符串的项为其名称等于指定字符串的项Choice组件使用 下拉菜单的事件处理方法和文本框列表(List)相同,当用户选择某个选项时,ItemEvent事件将被触发。例Ex9_24Choice组件的使用程序分析:当选择某一选项时,窗口中的标签颜色将相应产生变化。本例和例22类似,类Ex9_24由接口ItemListener实现,所以Ex9_24类对象frm就可以用来监听ItemEvent事件。当用户选择某一个选项时,ItemEvent事件e将被触发,相应的itemStateChanged()方法就会执行。使用Choice类对象的getSelectedItem()方法获取哪个选项被选中,根据返回值设置窗口中标签对象的前景色。也可以使用getSelectedIndex()方法来实现。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。