编写图形用户界面.ppt
第第9 9章章 编写编写JAVAJAVA图形界面图形界面主要内容主要内容n了解了解Java的的GUI类类n研究研究AWT和和Swing组件之间的区别组件之间的区别n创建创建GUI窗口窗口n使用布局管理器使用布局管理器n处理处理GUI事件事件n使用按钮、标签、文本框、面板和菜单使用按钮、标签、文本框、面板和菜单n将将AWT转化为转化为Swing了解了解JavaJava的的GUIGUI类类GUI(Graphics User Interface)按钮、复选框、标签和其他简单组件文本域、滑动条以及其他复杂的组件下拉菜单和弹出菜单窗口、对话框和Applet窗口AWTAWT和和SwingSwing组件组件AWT:抽象窗口工具集:抽象窗口工具集(Abstract Window Tools),Java的早期版本,组件种类有限,的早期版本,组件种类有限,java.awt.*(Label)Swing:重写:重写AWT,扩充的,扩充的AWT,40多个组件,多个组件,是是AWT的的4倍,倍,javax.swing.*(JLabel)1.AWT的概述的概述:用于图形用户界面的开发。用于图形用户界面的开发。AWT中的主要软件包中的主要软件包:使用使用AWTAWT类类2.AWT2.AWT的分类的分类:1.1.基本组件:基本组件:基本组件是图形界面的最小单位,里面不再包含其基本组件是图形界面的最小单位,里面不再包含其他的成分。他的成分。如:按钮如:按钮ButtonButton、复选框复选框Checkbox Checkbox、组合框、组合框Choice Choice、列表、列表ListList、文本域、文本域 Textfield Textfield、多行文、多行文本域本域TextareaTextarea、静态文本、静态文本LabelLabel、滚动条、滚动条ScrollbarScrollbar等。等。2.2.包容器(包容器(ContainerContainer):包容器是一种特殊的组件,用来包含其他组件。包容器是一种特殊的组件,用来包含其他组件。如:面板如:面板PanelPanel、窗口、窗口 Windows Windows、对话对话框框DialogDialog、文件文件对话对话框框 Filedialog Filedialog、框架、框架FrameFrame等。等。使用使用AWTAWT类类3.AWT组件的类层次组件的类层次:ComponentComponent类的主要方法有:类的主要方法有:lvoid enable()void enable():使组件可用。:使组件可用。lvoid disable()void disable():使组件不可用。:使组件不可用。lvoid show()void show():显示组件。:显示组件。lvoid paint()void paint():绘制图形。:绘制图形。lvoid repaint()void repaint():刷新。:刷新。所有的所有的UIUI组组件都可件都可继继承或重承或重载载以上方法。以上方法。ContainerContainer类的主要方法:类的主要方法:lvoid add(Component c)void add(Component c):将指定组:将指定组件件c c加入到容器中。加入到容器中。lvoid SetLayout()void SetLayout():设置布局管理器:设置布局管理器 所有的包容器组件都可继承或重载所有的包容器组件都可继承或重载以上方法。以上方法。使用使用AWTAWT类类Java的的 GUI设设 计计 既既 可可 用用 于于 Java Application,也可用于也可用于Java Applet。Java的的GUI设计包括以下方面:设计包括以下方面:界面上放置哪些组件,界面上放置哪些组件,这些组件以什么样的布局放置。这些组件以什么样的布局放置。如何如何进进行事件行事件处处理。理。使用使用AWTAWT类类框架窗口组件(框架窗口组件(Frame):):FrameFrame是是独独立立于于浏浏览览器器的的可可独独立立运运行行的的主主窗窗口口,通通常常用用于于进行开发桌面应用程序。进行开发桌面应用程序。FrameFrame拥拥有有边边界界和和标标题题栏栏设设置置,其其大大小小可可以以进进行行设设置置调调整整。FrameFrame里里面面需需要要加加入入组组件件,也也可可以以加加入入菜菜单单,或或在在上上面面绘绘图。图。pFrameFrame的创建:的创建:(1)Frame()(1)Frame():创建一个没有窗口标题的窗口框架;:创建一个没有窗口标题的窗口框架;(2)Frame(String)(2)Frame(String):创建一个指定窗口标题的窗口框架。:创建一个指定窗口标题的窗口框架。窗口窗口importjava.awt.*;publicclassFrame1extendsFramepublicFrame1()this.setSize(320,150);this.setTitle(“FrameExample);this.setVisible(true);publicstaticvoidmain(Stringargs)Frame1nowFrame=newFrame1();窗口窗口标签组件(标签组件(Label):):标签组件显示的是静态文本,在通常情况下是不能标签组件显示的是静态文本,在通常情况下是不能编辑的,能起到提示的作用。编辑的,能起到提示的作用。pLabelLabel的创建:的创建:Label Label组件有三种构造函数:组件有三种构造函数:(1)Label(1)Label():创建空的标签;():创建空的标签;(2)Label(2)Label(StringString):创建一个带初始字符串的标签;):创建一个带初始字符串的标签;(3)(3)LabelLabel(StringString,intint):创创建建一一个个带带初初始始字字符符串串及及指指定定对对齐齐方式的标签。方式的标签。其其中中对对齐齐方方式式有有几几种种形形式式:LeftLeft(Label.LEFTLabel.LEFT)、RightRight、CenterCenter。LabelLabel默认对齐方式为左对齐。默认对齐方式为左对齐。标签组件(标签组件(LabelLabel)标签组件(标签组件(Label):):pLabelLabel的主要方法的主要方法:标签组件(标签组件(LabelLabel)Label示例示例LabelExample.javaimportjava.awt.*;publicclassLabelExampleextendsFramepublicLabelExample()this.setLayout(newGridLayout(5,1);/网格布局Labell1=newLabel();/创建空的标签this.add(l1);l1.setText(no1);/设置标签内容Labell2=newLabel(no2);/创建带初始内容的标签this.add(l2);Labell3=newLabel(Label.LEFT,Label.LEFT);/左对齐this.add(l3);标签组件(标签组件(LabelLabel)Label示例示例LabelExample.javaLabell4=newLabel(Label.RIGHT,Label.RIGHT);/居中this.add(l4);Labell5=newLabel(Label.CENTER,Label.CENTER);/右对齐this.add(l5);this.setSize(320,150);this.setTitle(LabelExample);this.setVisible(true);publicstaticvoidmain(Stringargs)LabelExamplez=newLabelExample();标签组件(标签组件(LabelLabel)标签组件(标签组件(LabelLabel)文文本本域域一一般般用用来来让让用用户户输输入入如如姓姓名名、信信用用卡卡号号这这样样的的信信息息,它它是是一一个个能能够够接接收收用用户户的的键键盘盘输输入的小块区域。入的小块区域。p文本域的创建:1.TextField():创建空的文本域。2.TextField(int):创建具有指定长度的文本域。3.TextField(String ):创建带有初始文本内容的文本域。4.TextField(String,int):创建带有初始文本内容并具有指定长度的文本域。文本域文本域(TextField)(TextField)p文本域的主要方法文本域的主要方法:文本域文本域(TextField)(TextField)TxtExample.javaTxtExample.javaimportjava.awt.*;public class TxtExample extends Frame TextField tf1,tf2,tf3,tf4;public TxtExample()this.setLayout(new FlowLayout();tf1=new TextField();/空的文本域tf2=new TextField(20);/长度为20的空的文本域tf3=new TextField(你好);/带有初始文本内容的文本域tf4=new TextField(你好,30);/带有初始文本内容并具有指定长度的文本域this.add(tf1);this.add(tf2);this.add(tf3);this.add(tf4);this.setSize(320,150);this.setTitle(Label Example);this.setVisible(true);public static void main(String args)TxtExample txt=new TxtExample();文本域文本域(TextField)(TextField)是是一一种种交交互互能能力力强强而而交交互互方方便便的的控控件件,这这个个组组件件提提供供了了“按按下下并动作并动作”的基本用户界面。的基本用户界面。p创建创建:(1)Button()(1)Button():建立一个没有标示字符串的新按钮类对象。:建立一个没有标示字符串的新按钮类对象。(2)Button(String label)(2)Button(String label):建立一个标示字符串为:建立一个标示字符串为labellabel的新按钮的新按钮。p按钮的主要方法:按钮的主要方法:按钮(按钮(Button)Button)importjava.awt.*;publicclassButtonExampleextendsFramepublicButtonExample()this.setLayout(newFlowLayout();Buttonbutton1=newButton();button1.setLabel(button1);Buttonbutton2=newButton(button2);this.add(button1);this.add(button2);this.setSize(320,150);this.setTitle(ButtonExample);this.setVisible(true);publicstaticvoidmain(Stringargs)ButtonExampleb=newButtonExample();按钮(按钮(Button)Button)事件事件是用户已经采取了某些操作的信号是用户已经采取了某些操作的信号也是也是MouseEvent,WindowEvent,ActionEvent之类之类的实例的实例事件处理事件处理事件源事件源事件监听器事件监听器事件处理三要素事件处理三要素事件源、事件类型、事件监听器为事件处理的三要素。事件源、事件类型、事件监听器为事件处理的三要素。1.事件源事件源 事件源是一个事件的产生者,如按钮、窗事件源是一个事件的产生者,如按钮、窗口、文本域等等。口、文本域等等。2.事件类型事件类型 Java中所有的事件都封装成一个类,这中所有的事件都封装成一个类,这些事件类被集中在包和包中,所有的事件类均继承些事件类被集中在包和包中,所有的事件类均继承了了AWTEvent类,所有的事件类均继承了一个方法类,所有的事件类均继承了一个方法getSouce()方法,该方法返回发生事件的对象。方法,该方法返回发生事件的对象。3.事件监听器事件监听器 不同的类型事件发生后,由事件监听不同的类型事件发生后,由事件监听器接收事件并调用相应的事件处理方法。所有的事器接收事件并调用相应的事件处理方法。所有的事件监听器实际上都是一个包中的接口,继承了接口。件监听器实际上都是一个包中的接口,继承了接口。不同事件类型的监听器具有不同的方法。不同事件类型的监听器具有不同的方法。事件处理事件处理l事件处理模型事件处理模型:事件被送往产生这个事件的组件,每一个组件注册一事件被送往产生这个事件的组件,每一个组件注册一个或多个称为监听器的类,这些类包含事件处理器,个或多个称为监听器的类,这些类包含事件处理器,用来接收和处理这些事件。采用这种方法,事件处理用来接收和处理这些事件。采用这种方法,事件处理器可以安排在与源组件分离的对象中。器可以安排在与源组件分离的对象中。l监听器监听器就是实现了就是实现了Listener接口的类。接口的类。实现实现Listener接口的类可以被注册为一个监听器。接口的类可以被注册为一个监听器。l事件是只向注册的监听器报告的对象。每个事件都有事件是只向注册的监听器报告的对象。每个事件都有一个对应的监听器接口,一个对应的监听器接口,事件处理事件处理在在Button对象上用鼠标进行点击时,将发送一个对象上用鼠标进行点击时,将发送一个ActionEvent事件。事件。这个这个ActionEvent事件会被使用事件会被使用addActionListener()方法方法进行注册的所有进行注册的所有ActionListener的的actionPerformed()方法方法接收。接收。ActionEvent类的类的getActionCommand()方法返回与动作方法返回与动作相关联的命令名称。以按钮的点击动作为例,将返回相关联的命令名称。以按钮的点击动作为例,将返回Button的标签。的标签。事件处理事件处理事件处理事件处理包含包含GUI事件处理的应用程序必须由以下几个步骤:事件处理的应用程序必须由以下几个步骤:l第一步,程序加入包。第一步,程序加入包。Import;l第二步,给所需的事件源对象注册事件监听器。第二步,给所需的事件源对象注册事件监听器。事件源对象事件源对象.addXXXListener(XXXListener););如果所在的容器主类已经实现了相应的事件监听器如果所在的容器主类已经实现了相应的事件监听器接口,即接口,即class XXXX extends YYYYYY implements ZZZListener则则addXXXListener()的参数为()的参数为this,否则需新建,否则需新建一个一个XXXListener类或其继承类。类或其继承类。l第三步,实现相应的方法。如果某个监听器接口第三步,实现相应的方法。如果某个监听器接口包含多个方法,则需要实现所有的方法。包含多个方法,则需要实现所有的方法。事件处理事件处理l点击按钮所发生的事件为动作事件,这是一种最点击按钮所发生的事件为动作事件,这是一种最常用的事件处理。常用的事件处理。l动作事件对应的事件类是动作事件对应的事件类是ActionEvent类,该类类,该类的主要方法见下图:的主要方法见下图:事件处理事件处理-按钮点击ActionListener的主要方法的主要方法:实现动作事件的操作过程是:实现动作事件的操作过程是:第一步,注册动作事件监听器第一步,注册动作事件监听器addActionListener(ActionListener)。第二步,实现第二步,实现ActionListener接口的方法:接口的方法:actionPerformed(ActionEvent e)。事件处理事件处理-按钮点击实现过程:实现过程:1修改ButtonExample,变成监听器publicclassButtonExampleextendsFrameimplementsActionListener2添加监听器,addActionListenerbutton1.addActionListener(this);button2.addActionListener(this);3添加事件接口方法,actionPerformed(ActionEvente)publicvoidactionPerformed(ActionEvente)/TODOAuto-generatedmethodstubif(e.getSource()=button1)System.out.println(button1hasbeenpressed);if(e.getSource()=button2)System.out.println(button2hasbeenpressed);事件处理事件处理-按钮点击窗口关闭需要响应窗口事件的接口命令WindowListener1修改ButtonExample,变成窗口监听器publicclassButtonExampleextendsFrameimplementsActionListener,WindowListener2添加监听器,addActionListenerthis.addWindowListener(this);3添加事件接口方法publicvoidwindowActivated(WindowEvente)publicvoidwindowClosed(WindowEvente)publicvoidwindowClosing(WindowEvente)System.exit(0);publicvoidwindowDeactivated(WindowEvente)publicvoidwindowDeiconified(WindowEvente)publicvoidwindowIconified(WindowEvente)publicvoidwindowOpened(WindowEvente)事件处理事件处理-窗口事件扩充适配器类:扩充适配器类:可实现监听器接口并重写具有空方法的所有接口方法通过使用扩充适配器类不再需要重写通过使用扩充适配器类不再需要重写7个接口方法个接口方法解决方案:解决方案:创建2个单独的类事件处理事件处理-窗口事件实现方法实现方法1添加扩充适配器类(ButtonExample.java)classWindowCloserextendsWindowAdapterButtonExampleframetoclose;publicWindowCloser(ButtonExampleframe)frametoclose=frame;publicvoidwindowClosing(WindowEvente)frametoclose.shutDown();2添加监听器()WindowClosereHandle=newWindowCloser(this);this.addWindowListener(eHandle);事件处理事件处理-窗口事件importjava.awt.*;import.*;publicclassAWTFrameWithAButtonextendsFrameimplementsActionListenerpublicAWTFrameWithAButton()ButtoncloseButton=newButton(Close);this.setLayout(newFlowLayout();this.add(closeButton);this.setSize(300,150);this.setTitle(AWTFrameWithAButton);this.setVisible(true);closeButton.addActionListener(this);WindowClosereventHandler=newWindowCloser(this);this.addWindowListener(eventHandler);publicvoidactionPerformed(ActionEvente)shutDown();事件处理事件处理-窗口事件publicvoidshutDown()this.dispose();System.exit(0);publicstaticvoidmain(Stringargs)/createinstanceofFrameAWTFrameWithAButtonframeWithButton=newAWTFrameWithAButton();classWindowCloserextendsWindowAdapterAWTFrameWithAButtonframeToClose;publicWindowCloser(AWTFrameWithAButtonframe)frameToClose=frame;publicvoidwindowClosing(WindowEventevent)frameToClose.shutDown();事件处理事件处理-窗口事件创建内部类:创建内部类:是在另一个类中定义的类重要好处:重要好处:可以扩充不同于外部类的类关键字:关键字:new编译结果:编译结果:两个class文件,一个是ButtonExample.class,另一个是ButtonExample$1.class事件处理事件处理-窗口事件实现方法实现方法在ButtonExample的构造函数中加入this.addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEventevent)shutDown(););事件处理事件处理-窗口事件关系关系事件处理事件处理-窗口事件触发鼠标事件的事件源通常是一个容器,当鼠标进触发鼠标事件的事件源通常是一个容器,当鼠标进入、离开容器,或者在容器中单击鼠标、拖动鼠标入、离开容器,或者在容器中单击鼠标、拖动鼠标等操作时,都发生鼠标事件。等操作时,都发生鼠标事件。鼠标事件对应的事件类是鼠标事件对应的事件类是MouseEvent类,该类的类,该类的主要方法:主要方法:事件处理事件处理-鼠标事件鼠标事件对应的事件监听器有两个:鼠标事件对应的事件监听器有两个:MouseListener(或者(或者MouseAdapter)对应)对应鼠标事件鼠标事件,MouseMontionListener(或者(或者MouseMontionAdaper)对应)对应鼠标移动事件鼠标移动事件。MouseListener类的主要方法类的主要方法MouseMontionListener的主要方法的主要方法 事件处理事件处理-鼠标事件实现鼠标事件的操作过程是:实现鼠标事件的操作过程是:注册注册MouseListener监听器监听器。addMouseListener();当事件源所在的类已经实现当事件源所在的类已经实现MouseListener接口时,参接口时,参数可用数可用this,否则需创建或继承一个,否则需创建或继承一个MouseListener。实现实现MouseListener接口的所有方法接口的所有方法,即,即MousePressed(MouseEvent e)MouseReleased(MouseEvent e)MouseEntered(MouseEvent e)MouseExited(MouseEvent e)MouseClicked(MouseEvent e)事件处理事件处理-鼠标事件import.*;importjava.awt.*;publicclassMouseExampleextendsFrameimplementsMouseListenerLabell1=newLabel(init);publicMouseExample()this.setLayout(newFlowLayout();add(l1);addMouseListener(this);publicvoidmousePressed(MouseEvente)intx=(int)e.getX();inty=(int)e.getY();l1.setText(在(+x+,+y+)处鼠标按下!);publicvoidmouseReleased(MouseEvente)intx=(int)e.getX();inty=(int)e.getY();l1.setText(在(+x+,+y+)处鼠标释放!);事件处理事件处理-鼠标事件public void mouseEntered(MouseEvent e)l1.setText(鼠标进入!);public void mouseExited(MouseEvent e)l1.setText(鼠标离开!);public void mouseClicked(MouseEvent e)if(e.getClickCount()=2)l1.setText(鼠标双击!);else l1.setText(鼠标点击!);事件处理事件处理-鼠标事件实现鼠标移动事件的操作过程是:实现鼠标移动事件的操作过程是:第一步,注册第一步,注册MouseMotionListener监听器。监听器。addMouseMotionListener();当事件源所在的类已经实当事件源所在的类已经实现现MouseMotionListener接口时,参数可用接口时,参数可用this,否则,否则需创建或继承一个需创建或继承一个MouseMotionListener。第二步,实现第二步,实现MouseMotionListener接口的所有方法,接口的所有方法,即即MouseMoved(MouseEvente)MouseDraged(MouseEvente)。事件处理事件处理-鼠标事件import.*;importjava.awt.*;publicclassMouseDrawextendsFrameimplementsMouseMotionListenerintx=-1,y=-1,con=3;publicMouseDraw()this.setSize(300,300);this.setVisible(true);this.addMouseMotionListener(this);this.addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEventevent)System.exit(0););事件处理事件处理-鼠标事件publicvoidpaint(Graphicsg)g.fillOval(x,y,con,con);publicvoidmouseDragged(MouseEvente)x=(int)e.getX();y=(int)e.getY();repaint();publicvoidmouseMoved(MouseEvente)publicvoidupdate(Graphicsg)paint(g);publicstaticvoidmain(Stringargs)MouseDrawframe=newMouseDraw();事件处理事件处理-鼠标事件在具有键盘焦点的组件中按下或释放键盘等操作时,在具有键盘焦点的组件中按下或释放键盘等操作时,都发生键盘事件。都发生键盘事件。键盘事件对应的事件类是键盘事件对应的事件类是KeyEvent类,该类的主类,该类的主要方法要方法:事件处理事件处理-键盘事件键盘事件键盘事件对应的事件监听器为:对应的事件监听器为:KeyListener或或KeyAdapter。KeyListener的主要方法的主要方法:事件处理事件处理-键盘事件实现键盘事件的操作过程是:实现键盘事件的操作过程是:注册注册KeyListener监听器监听器,addKeyListener();当事件当事件源所在的类已经实现源所在的类已经实现KeyListener接口时,参数可接口时,参数可用用this,否则需创建或继承一个,否则需创建或继承一个KeyListener。实现实现KeyListener接口的所有方法,即接口的所有方法,即KeyPressed(KeyEvente)KeyReleased(KeyEvente)KeyTyped(MouseEvente)事件处理事件处理-键盘事件importjava.awt.*;import.*;publicclasskeyListenerextendsFrameimplementsKeyListenerTextFieldtxt=newTextField();publicLabell1=newLabel();publickeylistener()setLayout(newFlowLayout();txt.addKeyListener(this);add(txt);add(l1);this.setSize(400,300);this.setTitle(KeyListener);this.setVisible(true);事件处理事件处理-键盘事件intnKeycode;publicvoidkeyPressed(KeyEvente)nKeycode=e.getKeyCode();l1.setText(键盘按下的键为:+e.getKeyText(nKeycode);publicvoidkeyReleased(KeyEvente)nKeycode=e.getKeyCode();l1.setText(键盘释放的键为:+e.getKeyText(nKeycode);publicvoidkeyTyped(KeyEvente)事件处理事件处理-键盘事件publicstaticvoidmain(Stringargs)keylistenernowframe=newkeylistener();nowframe.addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEvente)System.exit(0););事件处理事件处理-键盘事件1.框架窗口组件(框架窗口组件(Frame):):FrameFrame是是独独立立于于浏浏览览器器的的可可独独立立运运行行的的主主窗窗口口,通通常常用用于于进行开发桌面应用程序。进行开发桌面应用程序。FrameFrame拥拥有有边边界界和和标标题题栏栏设设置置,其其大大小小可可以以进进行行设设置置调调整整。FrameFrame里里面面需需要要加加入入组组件件,也也可可以以加加入入菜菜单单,或或在在上上面面绘绘图。图。pFrameFrame的创建:的创建:(1)Frame()(1)Frame():创建一个没有窗口标题的窗口框架;:创建一个没有窗口标题的窗口框架;(2)Frame(String)(2)Frame(String):创建一个指定窗口标题的窗口框架。:创建一个指定窗口标题的窗口框架。窗口及菜单设计窗口及菜单设计import.*;importjava.awt.*;publicclassFrame1extendsFrameLabell1;TextFieldtxt1;Labell2;Buttonb1;Buttonb2;Labell3;publicFrame1()setTitle(Frame1);/设置窗口的标题setLayout(newFlowLayout();/设置布局l1=newLabel(1+1=);add(l1);txt1=newTextField(1);add(txt1);b1=newButton(ok);add(b1);b2=newButton(cancel);add(b2);窗口及菜单设计窗口及菜单设计l2=newLabel(Youransweris:);add(l2);l3=newLabel(init);add(l3);/以上为在Frame上放置多个组件setResizable(false);/设置窗口不可缩放setVisible(true);publicstaticvoidmain(Stringargs)Frame1nowFrame=newFrame1();nowFrame.addWindowListener(newWindowAdapter()/窗口事件处理 publicvoidwindowClosing(WindowEvente)System.exit(0););窗口及菜单设计窗口及菜单设计2.菜单组件菜单组件由菜单栏MenuBar、菜单(Menu)和菜单项三部分组成。一个菜单栏由若干个菜单组成,一个菜单又由若干个菜单项组成。p菜单栏菜单栏MenuBarMenuBar:(1)MenuBar():创建菜单栏。(2)MenuBar的主要方法:窗口及菜单设计窗口及菜单设计p菜单(菜单(Menu)Menu)(1)Menu(String):以指定标签创建菜单。(2)Menu的主要方法窗口及菜单设计窗口及菜单设计p菜单项(菜单项(MenuItemMenuItem)(1)MenuItem(String):以指定标签创建菜单项。(2)MenuItem的主要方法窗口及菜单设计窗口及菜单设计用用JavaJava创建菜单的过程如下:创建菜单的过程如下:(1)创建一个菜单栏。(2)调用Frame的setMenuBar()方法将菜单栏加入Frame中。(3)分别创建若干个Menu对象,并加入MenuBar中。(4)对 于 每 个 Menu对 象,分 别 创 建 若 干 个MenuItem对象,并加入Menu中。窗口及菜单设计窗口及菜单设计JMenuBarmenuBar=newJMenuBar();JMenufileMenu=newJMenu(File);JMenuhelpMenu=newJMenu(Help);JMenuItemdisplayMenu=newJMenuItem(Display);JMenuItemclearMenu=newJMenuItem(Clear);JMenuItemcloseMenu=newJMenuItem(Close);this.setJMenuBar(menuBar);menuBar.add(fileMenu);menuBar.add(helpMenu);fileMenu.add(displayMenu);fileMenu.add(clearMenu);fileMenu.add(closeMenu);窗口及菜单设计窗口及菜单设计displayMenu.addActionListener(this);clearMenu.addActionListener(this);closeMenu.addActionListener(this);publicvoidactionPerformed(ActionEvente)if(e.getSource()=displayMenu)displayMessage();if(e.getSource()=clearMenu)clearMessage();if(e.getSource()=closeMenu)shutDown();窗口及菜单设计窗口及菜单设计l布局管理器布局管理器:用于容器类中用于容器类中,可以确定容器中组可以确定容器中组件的位置和大小。件的位置和大小。l布局管理器接口布局管理器接口LayoutManager:它的实现类它的实现类可以自动根据运行平台的不同来布置各种组件。可以自动根据运行平台的不同来布置各种组件。l 每一个容器组件都有一个默认的布局管理器