第十五章 建立窗口和菜单.docx
《第十五章 建立窗口和菜单.docx》由会员分享,可在线阅读,更多相关《第十五章 建立窗口和菜单.docx(19页珍藏版)》请在冰豆网上搜索。
第十五章建立窗口和菜单
第十五章建立窗口和菜单 返回主页 上一章下一章
15.1Java窗口
15.2向窗口增加菜单
15.3处理菜单选项上的事件
15.4有关菜单的几个技巧
15.5使用适配器
15.6打印
15.7使用剪贴板
☆进入DOS状态 ☆写字版 ☆绘图板 ☆Tomcat_JSP服务器在C盘,在D盘 ☆进入Editplus
15.1Java窗口本章开头下一节
AWT根据类的层次定义窗口,并在每一层添加了特定的功能。
在这些窗口中,用得最普遍的是在小应用程序派生于Panel类的窗口和派生于Frame类的独立窗口。
这些窗口的功能大多数来自于它们的父类。
因此,与Panel和Frame这两个类相关的类结构的描述是我们理解它们的基础。
在图15-1中展示了Panel和Frame类的结构。
现在让我们分别来看一下这些类。
15.1.1组件(Component)
在AWT类层次结构的顶部是Component类。
Component类是一个封装了一个可视组件的所有属性的抽象类。
在屏幕上显示的所有用于用户交互的用户界面元素都是Component类的子类。
这个类定义了一百多个用于事件管理的公共方法,这些事件包括鼠标或键盘的输入,窗口位置或大小的改变以及重绘窗口。
一个Component对象可以保存当前的前景色、背景色以及被选择的文本的字体。
图15-1Panel和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对象,它将包含一个例如“JavaAppletWindow”的警告消息给用户,表示一个小应用程序窗口已经被创建。
这个消息警告用户,他们看见的窗口是由小应用程序启动的,而不是被运行在他们机器上的软件所启动(一个伪装基于主机的应用程序的小应用程序将可以用于在用户不知道的情况下获得密码和其他敏感信息)。
当一个Frame窗口被程序而不是小应用程序创建时,就创建了一个通常的窗口。
15.1.5画布(Canvas)
虽然画布不是小应用程序和frame窗口的层次结构的一部分,但是Canvas这种类型的窗口是很有用的。
Canvas类封装了一个你可以用来绘制的空白窗口。
在教材的第11章已经学过有关Canvas的例子。
15.1.6用Frame窗口工作
在小应用程序之中,你最常创建的窗口来自于Frame类。
你将用它在小应用程序中创建子窗口,在应用程序中创建顶级或子窗口。
正如前面所提到的那样,它会生成一个标准样式的窗口。
Frame的构造函数如下所示:
Frame()
Frame(Stringtitle)
第一种形式用于创建一个不含标题的标准窗口。
第二种形式用于创建一个含有标题的窗口,这个标题是由title变量指定的。
请注意你不能在创建时指定窗口的大小,你必须在窗口被创建后再设置窗口的大小。
这里有几个方法在你使用Frame窗口时将会用到。
下面我们举例说明。
15.1.7设置窗口大小
setSize()这个方法用来设置窗口的大小,如下所示:
voidsetSize(intnewWidth,intnewHeight)
voidsetSize(DimensionnewSize)
窗口的新的大小在变量newWidth和newHeight中被指定,或者在来自Dimension类的newSize对象的width和height这两个成员变量中被指定。
这些大小使用像素为单位。
getSize()这个方法被用来获得当前的窗口大小,如下所示:
DimensiongetSize()
这个方法返回一个Dimension对象,在这个对象的成员变量width和height中存放着当前窗口的大小。
15.1.8隐藏和显示一个窗口
当一个frame窗口被创建以后,这个窗口默认是不可见的,除非你调用它的setVisible()方法。
如下所示:
voidsetVisible(booleanvisibleFlag)
如果这个方法的参数是true,那么调用它的组件是可见的。
否则,就被隐藏。
15.1.9设置窗口标题
你可以通过使用setTitle()方法来改变一个frame窗口的标题。
如下所示:
voidsetTitle(StringnewTitle)
在这里,参数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,Createachildframewindowfromwithinanapplet.
importjava.awt.*;
importjava.awt.event.*;
importjava.applet.*;
/*
*/
//CreateasubclassofFrame.
classSampleFrameextendsFrame{
SampleFrame(Stringtitle){
super(title);
//createanobjecttohandlewindowevents
MyWindowAdapteradapter=newMyWindowAdapter(this);
//registerittoreceivethoseevents
addWindowListener(adapter);
}
publicvoidpaint(Graphicsg){
g.drawString("Thisisinframewindow",10,40);
}
}
classMyWindowAdapterextendsWindowAdapter{
SampleFramesampleFrame;
publicMyWindowAdapter(SampleFramesampleFrame){
this.sampleFrame=sampleFrame;
}
publicvoidwindowClosing(WindowEventwe){
sampleFrame.setVisible(false);
}
}
//Createframewindow.
publicclassexa15_1extendsApplet{
Framef;
publicvoidinit(){
f=newSampleFrame("AFrameWindow");
f.setSize(250,250);
f.setVisible(true);
}
publicvoidstart(){
f.setVisible(true);
}
publicvoidstop(){
f.setVisible(false);
}
publicvoidpaint(Graphicsg){
g.drawString("Thisisinappletwindow",10,20);
}
}
这个例子的输出如下所示:
图15-2FrameWindow示例
教材例子1见Ex