?? s02.htm
字號:
<SCRIPT LANGUAGE="JavaScript" SRC="/-fs0/sys/pop-up.js"></SCRIPT><SCRIPT LANGUAGE="JavaScript" SRC="/-fs0/sys/pop-up-all.js"></SCRIPT><html><head><title>易都網(wǎng)--Java 2 圖形設(shè)計(jì)卷Ⅱ:SWING</title><LINK rel="stylesheet" href="../../../_public/javaa.css"><meta http-equiv="Content-Type" content="text/html; charset=GBK"><script language="JavaScript" src="../../../_public/javaa.js"></script><meta name="keywords" content="Java,JSP,ASP,PHP,J2EE,EJB,JavaScript,C/C++,ASM,CSS,HTML,XML,網(wǎng)絡(luò)安全,MySQL,ACCESS"></head><body bgcolor="#FFFFFF"><table border=0 cellpadding=0 cellspacing=0 width="100%"> <tbody> <script language="javascript">print2()</script> <tr> <td width="100%"> <table bgcolor=#EEEEEE border=0 cellpadding=3 cellspacing=0 width="100%"> <tbody> <tr> <td class=f1 id=thetd width="100%"> <p>[<a href="index.html" target="_self">目錄</a>][<a href="s01.htm" target="_self">上一頁</a>][<a href="s03.htm" target="_self">下一頁</a>]</p> <p align="center"><b>第2章 Swing的基本知識</b></p> <p> 本章介紹開發(fā)Swing小應(yīng)用程序和應(yīng)用程序時要用到的Swing的基本知識。<br> 雖然Swing是AWT的擴(kuò)展,但是兩者的基本概念還是有許多不同之處。首先,Swing小應(yīng)用程序和應(yīng)用程序的實(shí)現(xiàn)方式與AWT小應(yīng)用程序和應(yīng)用程序的實(shí)現(xiàn)方式有所不同。而且,如果開發(fā)人員想要開發(fā)同時使用AWT組件和Swing組件的小應(yīng)用程序或應(yīng)用程序,則還必須注意混合使用輕量組件和重量組件所帶來的許多問題。<br> Swing是線程不安全的,這就是說,在大多數(shù)情況下,只能從事件派發(fā)線程中訪問Swing組件。本章將介紹采用這種方法的原因及使用這種方法所帶來的結(jié)果,另外,本章還介紹了Swing提供的一些機(jī)制,這些機(jī)制使其他線程能從事件派發(fā)線程中執(zhí)行代碼。 </p> <p><b><a name="2.1"></a>2.1 小應(yīng)用程序與應(yīng)用程序</b></p> <p> 使用Swing組件的小應(yīng)用程序和應(yīng)用程序應(yīng)該分別擴(kuò)展Swing的JApplet(java.applet.Applet的一個擴(kuò)展)和JFrame(java.awt.Frame的一個擴(kuò)展)。JApplet和JFrame除具有它們的超類所提供的功能外,還提供對Swing的支持。雖然可以分別使用Applet類和Frame類來實(shí)現(xiàn)Swing的小應(yīng)用程序和應(yīng)用程序,但是,這樣很可能出現(xiàn)事件處理問題和重新繪制問題。因此,應(yīng)當(dāng)總是使用JApplet和JFrame來實(shí)現(xiàn)Swing的小應(yīng)用程序和應(yīng)用程序。<br> JApplet和JFrame都是只包含一個組件的容器,這個組件是JRootPane的一個實(shí)例,JRootPane在12.2節(jié)“JRootPane”中介紹。目前,只需知道JRootPane包含一個稱作為內(nèi)容窗格的容器即可。內(nèi)容窗格包含與特定的小應(yīng)用程序或應(yīng)用程序有關(guān)的所有內(nèi)容。這里,內(nèi)容指包含在小應(yīng)用程序和或應(yīng)用程序中的組件。實(shí)際上,這就是說小應(yīng)用程序和應(yīng)用程序必須把組件添加到內(nèi)容窗格中而不是把它們直接添加到小應(yīng)用程序或應(yīng)用程序(或根窗格)中。而且,我們不應(yīng)該直接為Swing小應(yīng)用程序或應(yīng)用程序設(shè)置布局管理器。因?yàn)榻M件添加到內(nèi)容窗格中,所以應(yīng)該為內(nèi)容窗格而不是小應(yīng)用程序或應(yīng)用程序設(shè)置布局管理器。<br> 包含一個JRootPane實(shí)例的Swing容器重載用來添加組件和設(shè)置布局管理器的方法。這些方法會彈出提醒人們的異常信息:不能把組件直接添加到包含一個JRootPane實(shí)例的Swing容器中,也不能為該容器設(shè)置布局管理器。 </p> <p><a name="2.1.1"></a><b>2.1.1 小應(yīng)用程序</b></p> <p> <a href="s02_t01.htm" target="_blank">圖2-1</a>所示的小應(yīng)用程序包含一個JLabel實(shí)例,該實(shí)例有一個圖標(biāo)和一些文本。該小應(yīng)用程序擴(kuò)展JApplet并通過調(diào)用JApplet.getContentPane()方法來獲得對其內(nèi)容窗格的引用。這個標(biāo)簽隨后被實(shí)例化并被添加到這個內(nèi)容窗格中。</p> <p> <applet code="Test.class" archive="s02_t01.jar" width=300 height=150> </applet><br> 圖2-1 Swing小應(yīng)用程序</p> <p> 例2-1列出了圖2-1所示的小應(yīng)用程序的代碼。</p> <p align="center"><b>例2-1 一個Swing小應(yīng)用程序</b></p> <p> import javax.swing.*;<br> import java.awt.*;<br> import java.awt.event.*;</p> <p> public class Test extends JApplet {<br> public void init() {<br> Container contentPane = getContentPane();<br> /*原文<br> Icon icon = new ImageIcon("swing.gif","An animated GIF of Duke on a swing");<br> JLabel label = new JLabel("Swing!",icon,SwingConstants.CENTER);<br> */<br> //修改后<br> JLabel label = new JLabel("Swing!", <br> new ImageIcon(getImage(getCodeBase(),"swing.gif"),"An animated GIF of Duke on a swing"),<br> SwingConstants.CENTER);<br> contentPane.add(label, BorderLayout.CENTER);<br> }<br> }</p> <p> JApplet類使用BorderLayout的一個實(shí)例作為其內(nèi)容窗格的布局管理器。為了強(qiáng)調(diào)這一點(diǎn),例2-1的小應(yīng)用程序指定其布局約束條件為BorderLayout.CENTER,它使標(biāo)簽在內(nèi)容窗格中居中顯示。用BorderLayout布局組件的缺省約束條件是BorderLayout.CENTER,所以,在該小應(yīng)用程序中指定這個布局約束條件不是必須的。<br> <b>注意:</b>當(dāng)在Internet Explorer中使用例2-1的小應(yīng)用程序時,必須使用BorderConstraints.CENTER。(我根本就找不到)<br> JApplet的內(nèi)容窗格用BorderLayout的一個實(shí)例來布局組件。記住這一點(diǎn)是很重要的,因?yàn)閖ava.applet.Applet與JApplet不同,它使用FlowLayout的一個實(shí)例來布局組件。 </p> <p><b><a name="2.1.2"></a>2.1.2 JApplet類</b></p> <p> Swing的JApplet類擴(kuò)展java.applet.Applet并實(shí)現(xiàn)Accessibility接口和RootPaneContainer接口。Accessibility接口是可訪問包的一部分,而RootPaneContainer接口(如其名字所指出的)是一個包含根窗格的容器。RootPaneContainer接口被所有包含一個JRootPane實(shí)例的Swing容器所實(shí)現(xiàn)。<br> 類總結(jié)2-1中列出了JApplet提供的public和protected方法</p> <p><b>類總結(jié) 2-1 JApplet</b></p> <p> 擴(kuò)展:java.applet.Applet<br> 實(shí)現(xiàn):javax.accessibility.Accessible、RootPaneContainer<br> 1.構(gòu)造方法<br> public JApplet()<br> JApplet中提供了一個不帶參數(shù)的構(gòu)造方法。由于小應(yīng)用程序是由瀏覽器(或小應(yīng)用程序閱讀器)進(jìn)行實(shí)例化的,所以,正常情況下,不需要直接把JApplet的一個實(shí)例進(jìn)行實(shí)例化。要了解直接實(shí)例化一個JApplet實(shí)例的情況,請參見2.1.5節(jié)“小應(yīng)用程序/應(yīng)用程序組合”。<br> 2.方法<br> (1)從java.awt.Container中重載而獲得的方法<br> protected void addImpl(Component,Object,int)<br> public void setLayout(LayoutManager)<br> public void addNotify()<br> public void removeNotify()<br> 上面列出的四種方法都是重載java.awt.Container類中的方法而得到。<br> AddImpl()是最終把組件添加到容器中的方法。如果直接把組件添加到小應(yīng)用程序中,那么JApplet.addImpl()將彈出一個異常信息。這個異常中所顯示的消息是定制的(注:消息是通過JApplet的擴(kuò)展的名字定制的)。例如,如果例2-1小應(yīng)用程序中的標(biāo)簽直接添加到該小應(yīng)用程序中,那么異常信息將如下顯示:<br> java.lang.Error:Do not use Test.add()use Test.getContentPane().add)instead<br> at javax.swing.JApplet.createRootPaneException(JApplet.java:198)<br> at javax.swing.JApplet.addImpl(JApplet.java:220)<br> at java.awt.Container.add(Container.java:179)<br> at Test.init(Test.java:11)<br> 與JApplet重載addImpl()的原因一樣,JApplet也重載setLayout()。如果設(shè)置了小應(yīng)用程序的布局管理器,setLayout()將會彈出一個異常信息。如果修改例2-1的小應(yīng)用程序,讓該小應(yīng)用程序試圖設(shè)置它的布局管理器,則將彈出帶有下面錯誤消息的異常信息:<br> java.lang.Error:Do not use Test.setLayout()use Test.getContentPane().setLayout()instead<br> at javax.swing.JApplet.createRootPaneexception(JApplet.java:198)<br> at javax.swing.JApplet.setLayout(JApplet.java:244)<br> at Test.init(Test.java:10)<br> at sun.applet.AppletPanel.run(AppletPanel.java:287)<br> at java.lang.Thread.run(Thread.java:474)<br> 當(dāng)實(shí)例化一個組件的對等組件時,將調(diào)用addNotify()方法。JApplet重載addNotify()以激發(fā)鍵盤事件并把小應(yīng)用程序的可見性設(shè)置為true。<br> (2)根窗格/內(nèi)容窗格/玻璃窗格<br> protected JRootPane createRootPane()<br> protected boolean isRootPaneCheckingEnabled()<br> protected void setRootPaneCheckingEnabled(boolean)<br> public Container getContentPane()<br> public Component getGlassPane()<br> public JLayeredPane getLayeredPane()<br> public JRootPane getRootPane()<br> public void setContentPane(Container)<br> public void setGlassPane(Component)<br> public void setLayeredPane(JLayeredPane)<br> public void setRootPane(JRootPane)<br> Swing小應(yīng)用程序通過調(diào)用protected JApplet.createRootPane方法,接著,這個方法又調(diào)用setRootPane()方法來創(chuàng)建根窗格。createRootPane方法可以被JApple的擴(kuò)展所重載,以便替代JRootPane類的擴(kuò)展作為該小應(yīng)用程序的根窗格。<br> 如前所述,把組件直接添加到JApplet的一個實(shí)例中或顯式地設(shè)置其布局管理器都可能會信息彈出一個異常。然而,有時必須把JRootPane的一個實(shí)例直接添加到小應(yīng)用程序中,并且不信息。通過調(diào)用以boolean值為為參數(shù)的setRootPaneCheckingEnabled()方法來設(shè)置一個標(biāo)志,該標(biāo)志跟蹤是否允許根窗格檢查。如果這個boolean值是true,則說明允許根窗格檢查,如果這個boolean值是false,則說明禁止根窗格檢查。<br> isRootPaneCheckingEnabled()方法返回最后傳送給setRootPaneCheckingEnabled()方法的boolean值。 <br> 注意:setRootPaneCheckingEnabled()和isRootPaneCheckingEnabled()都是protected方法。雖然不可能把組件直接添加到JApplet的一個實(shí)例中或顯式地設(shè)置其布局管理器,但是,實(shí)現(xiàn)可以控制是否允許根窗格檢查的JApplet的擴(kuò)展是可能的。這種功能使JAppelt的擴(kuò)展能夠在需要時直接添加組件或設(shè)置小應(yīng)用程序的布局管理器。<br> 實(shí)際中,很少重載JApplet.createRootPane(),JApplet的擴(kuò)展也很少用setRootPaneCheckingEnabled()來直接添加組件或設(shè)置小應(yīng)用程序的布局管理器。<br> 上面列出的第二組方法是由RootPaneContainer接口定義的,這些方法能夠獲取和設(shè)置包含在JRootPane的一個實(shí)例中的容器。JRootPane和RootPaneContainer將在第12章和12.2節(jié)“JRootPane” 中介紹。<br> (3)可訪問的相關(guān)內(nèi)容/菜單欄/鍵盤事件/更新<br> public AccessableContext getAccessableContext()<br> public JMenuBar getMenuBar()<br> public void setMenuBar(JMenuBar)<br> proteted voidprocessKeyEvent(KeyEvent)<br> public void update(Graphics)<br> getAccessibleContext()返回AccessibleContext的一個實(shí)例,這個實(shí)例把小應(yīng)用程序的可訪問信息提供給可訪問工具。<br> -------- <br> JApplet實(shí)例可以有一個菜單欄,它是由setJMenuBar方法指定的。注意,Swing小應(yīng)用程序能有一個菜單欄,而AWT小應(yīng)用程序卻不能。參見圖2-2。<br> 實(shí)際上有兩種方法把菜單欄添加到Swing小應(yīng)用程序中的方法。一種方法當(dāng)然是調(diào)用JApplet.setJMenuBar,另一種方法是獲得對小應(yīng)用程序根窗格的引用,然后把菜單欄直接添加到根窗格中。<br> 重載ProcessKeyEvent()來處理鍵綁定問題。有關(guān)Swing組件中鍵擊處理的更多信息,請參見4.8節(jié)“鍵出處理”。<br> 重載JApplet.update方法以便直接調(diào)用paint()。缺省時,AWT組件將實(shí)現(xiàn)它們的update方法以便擦除背景,然后調(diào)用paint()。這種技術(shù)在組件反復(fù)更新時,會導(dǎo)致許多閃爍。有關(guān)繪制和更新AWT組件的更多信息,請參見《Java 2 圖形設(shè)計(jì),卷Ⅰ:AWT》。</p> <p><b>Swing提示</b></p> <p><b>JApplet和JFrame的內(nèi)容窗格使用一個BorderLayout實(shí)例</b><br> 如果你用AWT開發(fā)過應(yīng)用程序,就一定熟悉這樣一個事實(shí):java.applet.Applet使用一個FlowLayout實(shí)例作為其布局管理器,而java.awt.Frame則使用一個BorderLayout實(shí)例作為其布局管理器。<br> 由于AWT小應(yīng)用程序和應(yīng)用程序使用不同的布局管理器,所以,當(dāng)把小應(yīng)用程序移植為應(yīng)用程序時或把應(yīng)用程序移植為小應(yīng)用程序時,就可造成混亂,這里還沒有涉及到實(shí)現(xiàn)一個小應(yīng)用程序和應(yīng)用程序組合的情況。相比之下,Swing在小應(yīng)用程序和應(yīng)用程序的內(nèi)容窗格中使用相同的布局管理器(即一個BorderLayout實(shí)例)。 </p>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -