第十五章 建立窗口和菜单.doc_第1页
第十五章 建立窗口和菜单.doc_第2页
第十五章 建立窗口和菜单.doc_第3页
第十五章 建立窗口和菜单.doc_第4页
第十五章 建立窗口和菜单.doc_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

第十五章 建立窗口和菜单返回主页上一章 下一章15.1 Java窗口15.2 向窗口增加菜单15.3 处理菜单选项上的事件15.4 有关菜单的几个技巧15.5 使用适配器15.6 打印15.7 使用剪贴板进入DOS状态写字版绘图板Tomcat_JSP服务器 在C盘,在D盘进入Editplus15.1 Java窗口 本章开头 下一节 AWT根据类的层次定义窗口,并在每一层添加了特定的功能。在这些窗口中,用得最普遍的是在小应用程序派生于Panel类的窗口和派生于Frame类的独立窗口。这些窗口的功能大多数来自于它们的父类。因此,与Panel和Frame这两个类相关的类结构的描述是我们理解它们的基础。在图15-1中展示了Panel和Frame类的结构。现在让我们分别来看一下这些类。15.1.1 组件(Component) 在AWT类层次结构的顶部是Component类。Component类是一个封装了一个可视组件的所有属性的抽象类。在屏幕上显示的所有用于用户交互的用户界面元素都是Component类的子类。这个类定义了一百多个用于事件管理的公共方法,这些事件包括鼠标或键盘的输入,窗口位置或大小的改变以及重绘窗口。一个Component对象可以保存当前的前景色、背景色以及被选择的文本的字体。图15-1 Panel 和Frame 的类层次结构 Container类是Component类的子类。这个类有一些附加方法,允许别的Component对象嵌套在Container类的对象中。当然,其他的Container对象可以被存放在一个Container对象中(因为它们也是Component类的实例)。这就形成了一个多层包容机制。容器主要负责布置它所包含的组件的位置。15.1.2 面板(Panel) Panel类是Container类的一个具体的子类。它没有添加任何新的方法;它只是简单的实现了Container类。一个Panel对象可以被看作是一个递归嵌套的具体的屏幕组件。Panel类是Applet类的子类。当屏幕输出直接传递给一个小应用程序时,它将在一个Panel对象的表面被画出。实际上,一个Panel对象是一个不包含标题栏、菜单栏以及边框的窗口。这就是为什么在浏览器中运行一个小应用程序时,你看不见标题栏、菜单栏以及边框的原因。而当你用小应用程序查看器来运行一个小应用程序时,小应用程序查看器提供了标题和边框。 其它的组件可以通过调用Panel类的add()方法被加入到一个Panel对象中,这个方法是从Container类继承来的。一旦这些组件被加入,那么你通常就可以通过调用在Component类中定义了的setLocation( ), setSize( )以及setBounds( )方法来改变这些组件的位置和大小。15.1.3 窗口(Window) 窗口类产生一个顶级窗口(Window)。顶级窗口不包含在任何别的对象中,它直接出现在桌面上。通常,你将不会直接产生Window对象。相反,你将使用Window类的子类,这就是Frame类。15.1.4 框架(Frame) Frame类封装了窗口通常所需要的一切组件,它是Window类的子类,并且拥有标题栏、菜单栏、边框以及可以调整大小的角。如果你在一个小应用程序中创建了一个Frame对象,它将包含一个例如“Java Applet Window”的警告消息给用户,表示一个小应用程序窗口已经被创建。这个消息警告用户,他们看见的窗口是由小应用程序启动的,而不是被运行在他们机器上的软件所启动(一个伪装基于主机的应用程序的小应用程序将可以用于在用户不知道的情况下获得密码和其他敏感信息)。当一个Frame窗口被程序而不是小应用程序创建时,就创建了一个通常的窗口。15.1.5 画布(Canvas) 虽然画布不是小应用程序和frame窗口的层次结构的一部分,但是Canvas这种类型的窗口是很有用的。Canvas类封装了一个你可以用来绘制的空白窗口。在教材的第11章已经学过有关Canvas的例子。15.1.6 用Frame窗口工作 在小应用程序之中,你最常创建的窗口来自于Frame类。你将用它在小应用程序中创建子窗口,在应用程序中创建顶级或子窗口。正如前面所提到的那样,它会生成一个标准样式的窗口。Frame的构造函数如下所示:Frame( )Frame(String title) 第一种形式用于创建一个不含标题的标准窗口。第二种形式用于创建一个含有标题的窗口,这个标题是由title变量指定的。请注意你不能在创建时指定窗口的大小,你必须在窗口被创建后再设置窗口的大小。 这里有几个方法在你使用Frame窗口时将会用到。下面我们举例说明。15.1.7 设置窗口大小setSize( )这个方法用来设置窗口的大小,如下所示:void setSize(int newWidth, int newHeight)void setSize(Dimension newSize) 窗口的新的大小在变量newWidth和newHeight中被指定,或者在来自Dimension类的newSize对象的width和height这两个成员变量中被指定。这些大小使用像素为单位。getSize( )这个方法被用来获得当前的窗口大小,如下所示:Dimension getSize( ) 这个方法返回一个Dimension对象,在这个对象的成员变量width和height中存放着当前窗口的大小。15.1.8 隐藏和显示一个窗口 当一个frame窗口被创建以后,这个窗口默认是不可见的,除非你调用它的setVisible( )方法。如下所示:void setVisible(boolean visibleFlag) 如果这个方法的参数是true,那么调用它的组件是可见的。否则,就被隐藏。15.1.9 设置窗口标题 你可以通过使用setTitle( )方法来改变一个frame窗口的标题。如下所示:void setTitle(String newTitle) 在这里,参数newtitle是窗口的新标题。15.1.10 关闭frame窗口 当使用一个frame窗口时,你的程序必须在它被关闭时通过调用setVisible(false)方法来将窗口从屏幕中除去。为了截获窗口关闭事件,你必须实现WindowListener监听器接口的windowClosing( )方法。在windowClosing( )方法中,你必须将窗口从屏幕中除去。15.1.11 在小应用程序中创建一个frame窗口 简单地通过创建一个frame类的实例来创建一个窗口是可能的,但是你可能很少会这样做,因为对于这样的窗口你没有什么可以做的。例如,你将不能接受和处理在这个窗口中发生的事件或者不能简单的输出信息给它。大多数情况下,你将创建一个frame类的子类。这样做,你将会重载frame类的方法和事件处理。 在小应用程序中创建一个新的基于frame的窗口是很容易的。首先,创建一个frame类的子类。接下来,重载任何一个标准窗口方法,比如init( )方法,start( )方法,stop( )方法和paint( )方法。最后,实现windowListener这个监听器接口的windowClosing( )方法,在这个方法中,当窗口被关闭时,调用setVisible(false)方法将窗口从屏幕中除去。 一旦你已经定义了一个frame类的子类,你就可以创建这个类的对象了。这就会产生一个基于frame的窗口,但是它在初始化中被设置为不可见的。你可以通过调用setVisible( )方法来使它可见。当这个窗口被创建后,它就有了一个默认的高度和宽度。你可以通过调用setSize( )方法来显式改变窗口的大小。 下面的小应用程序创建了一个叫做SampleFrame的Frame类的子类。这个子类的窗口在AppletFrame类的init()方法中实例化。请注意SampleFrame类调用了Frame类的构造函数。这将创建一个标准的frame窗口,它的标题由title参数决定。这个例子重载了小应用程序窗口的start()方法和stop()方法,所以在这两个方法中相应地显示和隐藏子窗口。这样当你在结束小应用程序时,关闭窗口,或者在浏览器中转移到另一页时,窗口都可以自动地被移去。而当你重新回到小应用程序时子窗口又被显示了出来。例15-1/ exa15_1.java, Create a child frame window from within an applet.import java.awt.*; import java.awt.event.*;import java.applet.*;/* */ Create a subclass of Frame.class SampleFrame extends Frame SampleFrame(String title) super(title); / create an object to handle window events MyWindowAdapter adapter = new MyWindowAdapter(this); / register it to receive those events addWindowListener(adapter); public void paint(Graphics g) g.drawString(This is in frame window, 10, 40); class MyWindowAdapter extends WindowAdapter SampleFrame sampleFrame; public MyWindowAdapter(SampleFrame sampleFrame) this.sampleFrame = sampleFrame; public void windowClosing(WindowEvent we) sampleFrame.setVisible(false); / Create frame window.public class exa15_1 extends Applet Frame f; public void init() f = new SampleFrame(A Frame Window); f.setSize(250, 250); f.setVisible(true); public void start() f.setVisible(true); public void stop() f.setVisible(false); public void paint(Graphics g) g.drawString(This is in applet window, 10, 20); 这个例子的输出如下所示:图15-2 Frame Window示例教材例子1见Example15_1.java,运行用Example15_1.htm教材例子2见Example15_2.java,运行用Example15_2.htm教材例子3见Example15_3.java,运行用java Example15_315.1.12 在Frame的窗口中处理事件 由于Frame类是Component类的子类,所以它继承了Component类的所有能力。这就意味着你可以像管理小应用程序主窗口一样地使用和管理frame窗口。例如,你可以重载paint()方法来显示输出,也可以在你需要恢复窗口时调用repaint()方法并且还可以重载所有的事件处理程序。无论何时,一个事件在窗口中发生时,由这个窗口定义的事件处理方法将被调用。每一个窗口都处理自己的事件。例如,接下来的程序创建了一个响应鼠标事件的窗口。 小应用程序的主窗口中也响应鼠标事件。当你运行这个程序时,你将看到鼠标事件被发送给了那个产生该事件的窗口。例15-2/ exa15_2.java, Handle mouse events in both child and applet windows.import java.awt.*;import java.awt.event.*;import java.applet.*;/* */ Create a subclass of Frame.class SampleFrame extends Frame implements MouseListener, MouseMotionListener String msg = ; int mouseX=10, mouseY=40; int movX=0, movY=0; SampleFrame(String title) super(title); / register this object to receive its own mouse events addMouseListener(this); addMouseMotionListener(this); / create an object to handle window events MyWindowAdapter adapter = new MyWindowAdapter(this); / register it to receive those events addWindowListener(adapter); / Handle mouse clicked. public void mouseClicked(MouseEvent me) / Handle mouse entered. public void mouseEntered(MouseEvent evtObj) / save coordinates mouseX = 10; mouseY = 54; msg = Mouse just entered child.; repaint(); / Handle mouse exited. public void mouseExited(MouseEvent evtObj) / save coordinates mouseX = 10; mouseY = 54; msg = Mouse just left child window.; repaint(); / Handle mouse pressed. public void mousePressed(MouseEvent me) / save coordinates mouseX = me.getX(); mouseY = me.getY(); msg = Down; repaint(); / Handle mouse released. public void mouseReleased(MouseEvent me) / save coordinates mouseX = me.getX(); mouseY = me.getY(); msg = Up; repaint(); / Handle mouse dragged. public void mouseDragged(MouseEvent me) / save coordinates mouseX = me.getX(); mouseY = me.getY(); movX = me.getX(); movY = me.getY(); msg = *; repaint(); / Handle mouse moved. public void mouseMoved(MouseEvent me) / save coordinates movX = me.getX(); movY = me.getY(); repaint(0, 0, 100, 60); public void paint(Graphics g) g.drawString(msg, mouseX, mouseY); g.drawString(Mouse at + movX + , + movY, 10, 40); class MyWindowAdapter extends WindowAdapter SampleFrame sampleFrame; public MyWindowAdapter(SampleFrame sampleFrame) this.sampleFrame = sampleFrame; public void windowClosing(WindowEvent we) sampleFrame.setVisible(false); / Applet window.public class exa15_2 extends Applet implements MouseListener, MouseMotionListener SampleFrame f; String msg = ; int mouseX=0, mouseY=10; int movX=0, movY=0; / Create a frame window. public void init() f = new SampleFrame(Handle Mouse Events); f.setSize(300, 200); f.setVisible(true); / register this object to receive its own mouse events addMouseListener(this); addMouseMotionListener(this); / Remove frame window when stopping applet. public void stop() f.setVisible(false); / Show frame window when starting applet. public void start() f.setVisible(true); / Handle mouse clicked. public void mouseClicked(MouseEvent me) / Handle mouse entered. public void mouseEntered(MouseEvent me) / save coordinates mouseX = 0; mouseY = 24; msg = Mouse just entered applet window.; repaint(); / Handle mouse exited. public void mouseExited(MouseEvent me) / save coordinates mouseX = 0; mouseY = 24; msg = Mouse just left applet window.; repaint(); / Handle button pressed. public void mousePressed(MouseEvent me) / save coordinates mouseX = me.getX(); mouseY = me.getY(); msg = Down; repaint(); / Handle button released. public void mouseReleased(MouseEvent me) / save coordinates mouseX = me.getX(); mouseY = me.getY(); msg = Up; repaint(); / Handle mouse dragged. public void mouseDragged(MouseEvent me) / save coordinates mouseX = me.getX(); mouseY = me.getY(); movX = me.getX(); movY = me.getY(); msg = *; repaint(); / Handle mouse moved. public void mouseMoved(MouseEvent me) / save coordinates movX = me.getX(); movY = me.getY(); repaint(0, 0, 100, 20); / Display msg in applet window. public void paint(Graphics g) g.drawString(msg, mouseX, mouseY); g.drawString(Mouse at + movX + , + movY, 0, 10); 图15-3 处理Frame Window中的鼠标事件15.2 向窗口增加菜单 上一节 下一节 本章开头 一个顶级窗口可能会使用菜单栏。一个菜单栏显示了一系列的顶级菜单选项。每个选项都与一个下拉式菜单相联。这种概念由Java中的下列类实现:MenuBar, Menu和MenuItem。一般来说,一个菜单栏包含了一个或更多的Menu对象。每个Menu对象都包含了一系列的MenuItem对象。每个MenuItem对象都代表了可被用户选择的某种东西。由于Menu是MenuItem的子类,将生成一个嵌套的子菜单的层次结构。包含可复选的菜单项的菜单也是可能的,CheckboxMenuItem类的菜单选项在它们被选中时会有一个复选标记在旁边。 为创建一个菜单栏,首先要创建MenuBar的一个实例。此类仅仅定义了默认的构造函数。接下来,还应该创建定义菜单栏显示选项的Menu的实例。下面是Menu的构造函数:Menu( )Menu(String optionName)Menu(String optionName, boolean removable) 这里,optionName设定了菜单选项的名字。如果removable为true,则弹出式菜单可被移开并自由漂动。否则,它将被附着在菜单栏上(可移动菜单是与实现有关的)。第一种形式创建一个空菜单。 每一个菜单项都属于MenuItem类。它定义了下列构造函数:MenuItem( )MenuItem(String itemName)MenuItem(String itemName, MenuShortcut keyAccel) 这里,参数itemName是菜单中显示的名字,参数keyAccel是此项的菜单快捷键。可以使用setEnabled()方法来启用或禁用一个菜单选项。它的形式如下所示:void setEnabled(boolean enabledFlag) 如果参数enabledFlag为true,菜单选项就被启用;如果为false,菜单选项就被禁用。可以通过调用isEnabled()方法判定一个选项的状态。方法如下所示:boolean isEnabled( ) 如果被调用的菜单选项被启用,则isEnabled()返回true;否则,返回false。 可以通过调用setLabel()方法改变一个菜单选项的名字。可以通过使用getLabel()方法查看当前菜单项的名字。这些方法如下所示:void setLabel(String newName)String getLabel( ) 这里,参数newName成为调用它的菜单选项的新名字。教材例子4见Example15_4.java,运行用Example15_4.htm15.3 处理菜单选项上的事件 上一节 下一节 本章开头 菜单项事件源有一种事件:鼠标单击某个选项。事件远获得监听器的方法是:addActionListener()。处理该事件的接口是actionPerformed(ActionEvent e)。这类事件的类型是ActionEvant,即当单击菜单项时,Java包java.awt.event中的类ActionEvent自动创建一个事件对象。 ActionEvent类中有一个重要的获得事件源的方法:getSource()。教材例子5见Example15_5.java,运行用Example15_5.htm教材例子6见Example15_6.java,用java.exe直接运行类文件15.4 有关菜单的几个技巧 上一节 下一节 本章开头15.4.1 增加菜单分割线 要增加菜单分割线,只需要使用Menu类中的addSeparator()方法,假设“文件”菜单是Menu的一个实例,“新建”、“”、“”是它的3个菜单项的名字。要想在菜单项之间加分割线,只需要源文件中有这样的行:menu1.add(新建);menu1.addSeparator();/分割线menu1.add(保存);menu1.add(打印);教材例子7见Example15_7.java,运行用Example15_7.htm图15-4 有分割线的菜单15.4.2 复选框菜单项 可以通过使用CheckboxMenuItem的MenuItem子类来生成一个可选的菜单选项。它有下列构造函数:CheckboxMenuItem( )CheckboxMenuItem(String itemName)CheckboxMenuItem(String itemName, boolean on) 在这里,参数itemName是菜单中显示的名字。每当一项被选时,它的状态就改变。在前两种形式中,可复选的项是未被选中的。第三种形式中,如果on为true,可复选项的初始状态为被选中;否则,则被清除选中。 你能通过调用getState()方法获得可选项的状态。通过使用setState()方法,能够将它设为一个已知的状态。这些方法如下所示:boolean getState( )void setState(boolean checked) 如果项被选中,则getState()返回true;否则,它返回false。为了选中一项,将true传给setState()方法。为了清除一项,则传递false。 一旦你生成了一个菜单选项,必须用add()方法将它加入Menu对象。Add()方法有下列一般形式:MenuItem add(MenuItem item) 这里,参数item是被加入的项。选项以add()方法调用的顺序被加入菜单,item被返回。一旦你已将所有选项加入Menu对象,你就能用由MenuBar()定义的add()方法的以下形式将这个对象加入菜单栏:Menu add(Menu menu) 这里,参数menu是被加入的菜单,Menu被返回。教材例子8见Example15_8.java,运行用Example15_8.htm 菜单仅在MenuItem类或CheckboxMenuItem类的选项被选中时才会产生事件。例如,当访问一个菜单栏显示向下弹出的菜单时,它们就不会产生事件。每当一个菜单选项被选中时,一个ActionEvent对象就被产生。每当一个复选菜单项被选中或被取消选中时,一个ItemEvent对象就被产生。这样,你必须实现ActionListener和ItemEvent接口以处理这些菜单事件。 ItemEvent的getItem()方法对产生事件的选项返回一个引用,该方法的一般形式如下所示:Object getItem() 下面是一个例子,它将一系列嵌入式的菜单加入一个弹出式窗口。所选定的选项,也显示了两个复选菜单选项的状态:例15-3/ exa15_3.java, Illustrate menus. import java.awt.*;import java.awt.event.*;import java.applet.*;/* */ Create a subclass of Frameclass MenuFrame extends Frame String msg = ; CheckboxMenuItem debug, test; MenuFrame(String title) super(title); / create menu bar and add it to frame MenuBar mbar = new MenuBar(); setMenuBar(mbar); / create the menu items Menu file = new Menu(File); MenuItem item1, item2, item3, item4, item5; file.add(item1 = new MenuItem(New.); file.add(item2 = new MenuItem(Open.); file.add(item3 = new MenuItem(Close); file.add(item4 = new MenuItem(-); file.add(item5 = new MenuItem(Quit.); mbar.add(file); Menu edit = new Menu(Edit); MenuItem item6, item7, item8, item9; edit.add(item6 = new MenuItem(Cut); edit.ad

温馨提示

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

评论

0/150

提交评论