第2章+swing的基本知识Word格式文档下载.docx
《第2章+swing的基本知识Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第2章+swing的基本知识Word格式文档下载.docx(37页珍藏版)》请在冰豆网上搜索。
图2-1所示的小应用程序包含一个JLabel实例,该实例有一个图标和一些文本。
该小应用程序扩展JApplet并通过调用JApplet.getContentPane()方法来获得对其内容窗格的引用。
这个标签随后被实例化并被添加到这个内容窗格中。
图2-1Swing小应用程序
例2-1列出了图2-1所示的小应用程序的代码。
例2-1一个Swing小应用程序
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
publicclassTestextendsJApplet{
publicvoidinit(){
ContainercontentPane=getContentPane();
/*原文
Iconicon=newImageIcon("
swing.gif"
"
AnanimatedGIFofDukeonaswing"
);
JLabellabel=newJLabel("
Swing!
"
icon,SwingConstants.CENTER);
*/
//修改后
newImageIcon(getImage(getCodeBase(),"
),"
),
SwingConstants.CENTER);
contentPane.add(label,BorderLayout.CENTER);
}
}
JApplet类使用BorderLayout的一个实例作为其内容窗格的布局管理器。
为了强调这一点,例2-1的小应用程序指定其布局约束条件为BorderLayout.CENTER,它使标签在内容窗格中居中显示。
用BorderLayout布局组件的缺省约束条件是BorderLayout.CENTER,所以,在该小应用程序中指定这个布局约束条件不是必须的。
注意:
当在InternetExplorer中使用例2-1的小应用程序时,必须使用BorderConstraints.CENTER。
(我根本就找不到)
JApplet的内容窗格用BorderLayout的一个实例来布局组件。
记住这一点是很重要的,因为java.applet.Applet与JApplet不同,它使用FlowLayout的一个实例来布局组件。
2.1.2JApplet类
Swing的JApplet类扩展java.applet.Applet并实现Accessibility接口和RootPaneContainer接口。
Accessibility接口是可访问包的一部分,而RootPaneContainer接口(如其名字所指出的)是一个包含根窗格的容器。
RootPaneContainer接口被所有包含一个JRootPane实例的Swing容器所实现。
类总结2-1中列出了JApplet提供的public和protected方法
类总结2-1JApplet
扩展:
java.applet.Applet
实现:
javax.accessibility.Accessible、RootPaneContainer
1.构造方法
publicJApplet()
JApplet中提供了一个不带参数的构造方法。
由于小应用程序是由浏览器(或小应用程序阅读器)进行实例化的,所以,正常情况下,不需要直接把JApplet的一个实例进行实例化。
要了解直接实例化一个JApplet实例的情况,请参见2.1.5节“小应用程序/应用程序组合”。
2.方法
(1)从java.awt.Container中重载而获得的方法
protectedvoidaddImpl(Component,Object,int)
publicvoidsetLayout(LayoutManager)
publicvoidaddNotify()
publicvoidremoveNotify()
上面列出的四种方法都是重载java.awt.Container类中的方法而得到。
AddImpl()是最终把组件添加到容器中的方法。
如果直接把组件添加到小应用程序中,那么JApplet.addImpl()将弹出一个异常信息。
这个异常中所显示的消息是定制的(注:
消息是通过JApplet的扩展的名字定制的)。
例如,如果例2-1小应用程序中的标签直接添加到该小应用程序中,那么异常信息将如下显示:
java.lang.Error:
DonotuseTest.add()useTest.getContentPane().add)instead
atjavax.swing.JApplet.createRootPaneException(JApplet.java:
198)
atjavax.swing.JApplet.addImpl(JApplet.java:
220)
atjava.awt.Container.add(Container.java:
179)
atTest.init(Test.java:
11)
与JApplet重载addImpl()的原因一样,JApplet也重载setLayout()。
如果设置了小应用程序的布局管理器,setLayout()将会弹出一个异常信息。
如果修改例2-1的小应用程序,让该小应用程序试图设置它的布局管理器,则将弹出带有下面错误消息的异常信息:
DonotuseTest.setLayout()useTest.getContentPane().setLayout()instead
atjavax.swing.JApplet.createRootPaneexception(JApplet.java:
atjavax.swing.JApplet.setLayout(JApplet.java:
244)
10)
atsun.applet.AppletPanel.run(AppletPanel.java:
287)
atjava.lang.Thread.run(Thread.java:
474)
当实例化一个组件的对等组件时,将调用addNotify()方法。
JApplet重载addNotify()以激发键盘事件并把小应用程序的可见性设置为true。
(2)根窗格/内容窗格/玻璃窗格
protectedJRootPanecreateRootPane()
protectedbooleanisRootPaneCheckingEnabled()
protectedvoidsetRootPaneCheckingEnabled(boolean)
publicContainergetContentPane()
publicComponentgetGlassPane()
publicJLayeredPanegetLayeredPane()
publicJRootPanegetRootPane()
publicvoidsetContentPane(Container)
publicvoidsetGlassPane(Component)
publicvoidsetLayeredPane(JLayeredPane)
publicvoidsetRootPane(JRootPane)
Swing小应用程序通过调用protectedJApplet.createRootPane方法,接着,这个方法又调用setRootPane()方法来创建根窗格。
createRootPane方法可以被JApple的扩展所重载,以便替代JRootPane类的扩展作为该小应用程序的根窗格。
如前所述,把组件直接添加到JApplet的一个实例中或显式地设置其布局管理器都可能会信息弹出一个异常。
然而,有时必须把JRootPane的一个实例直接添加到小应用程序中,并且不信息。
通过调用以boolean值为为参数的setRootPaneCheckingEnabled()方法来设置一个标志,该标志跟踪是否允许根窗格检查。
如果这个boolean值是true,则说明允许根窗格检查,如果这个boolean值是false,则说明禁止根窗格检查。
isRootPaneCheckingEnabled()方法返回最后传送给setRootPaneCheckingEnabled()方法的boolean值。
setRootPaneCheckingEnabled()和isRootPaneCheckingEnabled()都是protected方法。
虽然不可能把组件直接添加到JApplet的一个实例中或显式地设置其布局管理器,但是,实现可以控制是否允许根窗格检查的JApplet的扩展是可能的。
这种功能使JAppelt的扩展能够在需要时直接添加组件或设置小应用程序的布局管理器。
实际中,很少重载JApplet.createRootPane(),JApplet的扩展也很少用setRootPaneCheckingEnabled()来直接添加组件或设置小应用程序的布局管理器。
上面列出的第二组方法是由RootPaneContainer接口定义的,这些方法能够获取和设置包含在JRootPane的一个实例中的容器。
JRootPane和RootPaneContainer将在第12章和12.2节“JRootPane”中介绍。
(3)可访问的相关内容/菜单栏/键盘事件/更新
publicAccessableContextgetAccessableContext()
publicJMenuBargetMenuBar()
publicvoidsetMenuBar(JMenuBar)
protetedvoidprocessKeyEvent(KeyEvent)
publicvoidupdate(Graphics)
getAccessibleContext()返回AccessibleContext的一个实例,这个实例把小应用程序的可访问信息提供给可访问工具。
--------
JApplet实例可以有一个菜单栏,它是由setJMenuBar方法指定的。
注意,Swing小应用程序能有一个菜单栏,而AWT小应用程序却不能。
参见图2-2。
实际上有两种方法把菜单栏添加到Swing小应用程序中的方法。
一种方法当然是调用JApplet.setJMenuBar,另一种方法是获得对小应用程序根窗格的引用,然后把菜单栏直接添加到根窗格中。
重载ProcessKeyEvent()来处理键绑定问题。
有关Swing组件中键击处理的更多信息,请参见4.8节“键出处理”。
重载JApplet.update方法以便直接调用paint()。
缺省时,AWT组件将实现它们的update方法以便擦除背景,然后调用paint()。
这种技术在组件反复更新时,会导致许多闪烁。
有关绘制和更新AWT组件的更多信息,请参见《Java2图形设计,卷Ⅰ:
AWT》。
Swing提示
JApplet和JFrame的内容窗格使用一个BorderLayout实例
如果你用AWT开发过应用程序,就一定熟悉这样一个事实:
java.applet.Applet使用一个FlowLayout实例作为其布局管理器,而java.awt.Frame则使用一个BorderLayout实例作为其布局管理器。
由于AWT小应用程序和应用程序使用不同的布局管理器,所以,当把小应用程序移植为应用程序时或把应用程序移植为小应用程序时,就可造成混乱,这里还没有涉及到实现一个小应用程序和应用程序组合的情况。
相比之下,Swing在小应用程序和应用程序的内容窗格中使用相同的布局管理器(即一个BorderLayout实例)。
2.1.3应用程序
例2-2所示的应用程序与例2-1所示的小应用程序在功能上是完成相同的。
它们都把JLabel的一个实例添加到它们的根窗格的内容窗格中。
例2-3列出了图2-3所用的应用程序的代码。
例2-3一个Swing应用程序
publicclassTestextendsJFrame{
publicTest(){
super("
AnApplication"
/*原文:
"
icon,
----*/
//修改成:
.URLcodebase=getClass().getResource("
,newImageIcon(codebase),SwingConstants.CENTER);
//---
publicstaticvoidmain(Stringargs[]){
finalJFramef=newTest();
f.setBounds(100,100,300,250);
f.setVisible(true);
f.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
f.addWindowListener(newWindowAdapter(){
publicvoidwindowClosed(WindowEvente){
System.exit(0);
}
});
应用程序比小应用程序要稍微复杂些,这是因为它们不是在浏览器内部运行的,即浏览器不启动它们也不设置它们的大小。
应用程序必须提供main方法,必须把一个窗体实例化,随后确定该窗体的大小(注:
可使用JFrame.pack()显式地给出窗体的大小)并使该窗体可见。
例2-2中的应用程序还设置窗体的缺省关闭操作并添加一个窗口监听器,该监听器在窗体被关闭后会退出这个应用程序。
有关Swing窗体的缺省关闭操作的更多信息,请参见2.1.4节“JFrame类”。
Swing小应用程序和应用程序有许多共同点。
它们都含有一个JRootPane实例,都必须把组件添加到根窗格的内容窗格中。
而且,不能显式地设置Swing小应用程序或Swing应用程序的布局管理器。
2.1.4JFrame类
JFrame类扩展java.awt.Frame,与JApplet类似,它也实现Accessible接口和RootPaneCotainer接口。
JFrame还实现Swing.WindowsConstants接口,该接口定义缺省关闭操作的常量。
有关Swing常量的更多信息,请参见6.4节“Swing常量”。
JFrame实惠许多在JApplet中能找到的、相同的方法。
与JApplet类似,为了不显式地设置其布局管理器或不把组件直接添加到窗体中,JFrame重载setLayout和addImpl方法。
JRame实现了所有在RootPaneContainer接口中定义的方法,还实现了通话和禁止根窗格检查的方法。
JFrame还实惠了确定当前是束启用了根窗格检查的方法。
类总结2-2总结了JFrame类。
类总结2-2JFrame
java.applet.Frame
publicJFrame()
publicJFrame(Stringtitle)
JFrame有两个构造方法,一个构造方法不带参数,一个构造方法以一个字符串为参数,该字符串代表窗体的标题。
浏览器或小应用程序的阅读器会调用Swing小应用程序的构造方法,因此,通常不需要开发人员编写代码来调用它的构造方法,但是,应用程序必须负责构造窗体并负责设置窗体的大小。
通常为JFrame的实例选择带一个字符串的构造方法,不带参数的构造方法将产生没有标题的窗体。
(1)与JApplet交叠的方法
prrotectedJRootPanecreateRootPane()
publicAccessibleContextgetAccessibleContext()
protectedvoidprocessKeyEvent(KeyEvent)
publicvoidsetMenuBar(JMenuBar)
publicvoidsetLayeredPanec(JlayeredPane)
protectedvoidsetRootPane(JRootPane)
上面列出的JFrame方法与JApplet中定义的方法交叠。
其中的大部分方法与JApplet中相应方法的实现方式是相同的。
例如,如果允许根窗格检查,则JFrame.setLayout和JFrame.addImpl都将弹出一个异常信息。
有关上述方法的更多信息,请参见“类总结2-1JApplet”。
(2)窗体初始化/缺省的关闭操作/窗口事件
protectedvoidframeInit()
publicintgetDefaultCloseOperation()
protectedvoidsetDefaultCloseOperation(int)
protectedvoidprocessWindowEvent(WindowEvent)
JFrame构造方法调用frameInit方法来初始化窗体。
JFrame的frameInit()方法允许窗体的键盘事件和窗口事件,设置窗体的根窗格和背景色,并允许根窗格检查。
如果缺省的设置不令人满意的话,也可扩展JFrame以重载frameInit()。
使用AWT窗体时,开发人要负责处理窗口关闭事件。
通常,这需要重载事件处理方法,需要简单地隐藏窗口或隐藏窗口并清除其本地资源。
而Swing通过把一个缺省关闭操作与每一个JFrame实例相关联来使窗口的关闭事件较容易处理。
可以用setDefaultCloseOperation方法来设置缺省的关闭操作,而且可以用getDefaultCloseOperation()来获取缺省的关闭操作。
可以传送给setDefaultCloseOperation()的integer值在WindowConstants类中定义,表2-1,表2-1列出了integer值。
表2