?? s02.htm
字號:
}</p> <p> 其思想是實現(xiàn)一個小應(yīng)用程序,這個小應(yīng)用程序包含一個main方法。這個main方法把JFrame實例化,而且還創(chuàng)建這個小應(yīng)用程序的一個實例。在調(diào)用小應(yīng)用程序的init方法后,窗體用該小應(yīng)用程序的內(nèi)容窗格來替代該窗體的內(nèi)容窗格。這個窗體接著設(shè)置其邊界和標題。并把它的可見性設(shè)置為true。<br> 從本質(zhì)上講,這種技術(shù)會產(chǎn)生共享一個內(nèi)容窗格的應(yīng)用程序和小應(yīng)用程序。當例2-3中的代碼被編譯后,它可以既作為小應(yīng)用程序運行又可以作為應(yīng)用程序運行。<br> 應(yīng)該注意的是,作為應(yīng)用程序/小應(yīng)用程序組合實現(xiàn)的應(yīng)用程序,在使用main方法創(chuàng)建的小應(yīng)用程序?qū)嵗龝r必須非常小心。因為瀏覽器或小應(yīng)用程序閱讀器不能把這種小應(yīng)用程序?qū)嵗赃@種小應(yīng)用程序是不完善的(從技術(shù)上說,它沒有小應(yīng)用程序的相關(guān)內(nèi)容)。因此,這種小應(yīng)用程序不能使用,例如,用Applet.getImage方法來獲取一幅圖像。實際應(yīng)用中,也沒有那么多限制,因為應(yīng)用程序除借用小應(yīng)用程序的內(nèi)容窗格外不需要使用小應(yīng)用程序。例如,應(yīng)用程序通常使用AWT工具包來獲取圖像,因此,不需要使用Applet.getImage方法。</p> <p><b>Swing提示</b></p> <p><b>不要直接把組件添加到Swing小應(yīng)用程序或應(yīng)用程序中,也不要顯式地設(shè)置其布局管理器</b><br> Swing小應(yīng)用程序和應(yīng)用程序都有一個JRootPane實例,該實例又含有一個稱作內(nèi)容窗格的容器。小應(yīng)用程序或應(yīng)用程序的內(nèi)容(即組件)必須添加到內(nèi)容窗格中。如果把組件直接添加到JApplet或JFrame的實例中,則會彈出一個異常信息,指出只能把組件添加到內(nèi)容窗格中。</p> <p> Swing小應(yīng)用程序和應(yīng)用程序都使用BorderLayout布局管理器來布局它們的JRootPane實例,并且不允許顯式地設(shè)置它們的布局管理器。如果試圖顯式地設(shè)置JApplet或JFrame的布局管理器,則會彈出一個異常信息,指出不可以顯式地設(shè)置其布局管理器。</p> <p> <b><a name="2.2"></a>2.2 GJApp</b></p> <p> 本書介紹的應(yīng)用程序都是在GJApp類的幫助下實現(xiàn)的,該類提供了一個狀態(tài)區(qū),并能從屬性文件中讀取資源。<a href="s02_t04.jar" target="_blank">圖2-4</a>所示的應(yīng)用程序是一個JFrame擴展,這個擴展用GJApp類來訪問一個狀態(tài)區(qū),這個狀態(tài)區(qū)顯示從GJApp.properties文件中獲取一個字符串。<br> GJApp.properties文件定義了一個屬性:<br> # Simple properties file<br> statusAreaText=text in the status area<br> 例2-4列出了圖2-4所示的應(yīng)用程序的代碼。</p> <p align="center"><b>例2-4 使用GJApp類</b></p> <p> import javax.swing.*;<br> import java.awt.*;<br> import java.awt.event.*;<br> import java.util.*;</p> <p> public class Test extends JFrame {<br> public Test() {<br> Container contentPane = getContentPane();<br> JPanel panel = new JPanel();</p> <p> panel.setBorder(BorderFactory.createEtchedBorder());<br> contentPane.add(panel,BorderLayout.CENTER);<br> contentPane.add(GJApp.getStatusArea(),BorderLayout.SOUTH);</p> <p> GJApp.showStatus(GJApp.getResource("statusAreaText"));<br> }<br> public static void main(String args[]) {<br> GJApp.launch(new Test(),"Status Area",300,300,450,300);<br> }<br> }</p> <p> 這個應(yīng)用程序創(chuàng)建JPanel的一個實例,指定該實例為內(nèi)容窗格的中心組件。用面板來突出狀態(tài)區(qū)上面的空間,并且這個面板還有一個蝕該邊框。<br> 應(yīng)用程序通過調(diào)用static GJApp.getStatusAreas方法來獲取對GJApp狀態(tài)區(qū)的引用。狀態(tài)區(qū)指定為內(nèi)容窗格南邊的組件。<br> static GJApp.showStatus方法以statusAreaText資源的字符串為參數(shù)把這個狀態(tài)區(qū)初始化。資源的字符串用static GJApp.getResource方法來獲得。<br> GJApp類有三個功能:<br> ·初始化并顯示傳送給static launch方法的窗體。<br> ·提供對小應(yīng)用程序狀態(tài)區(qū)面板的訪問<br> ·從GJApp.properties文件中查找資源字符串。<br> 例2-5列出了GJApp類。 <br> </p> <p align="center"><b>例2-5 GJApp類</b><br> </p> <p> class GJApp {<br> static private JPanel statusArea = new JPanel();<br> static private JLabel status = new JLabel("");<br> static private ResourceBundle resources;</p> <p> static {<br> resources = ResourceBundle.getBundle(<br> "GJApp", Locale.getDefault());<br> };</p> <p> private GJApp() {} // defeat instantiation <br> public static void launch(final JFrame f, String title,<br> final int x, final int y, <br> final int w, int h) {<br> f.setTitle(title);<br> f.setBounds(x,y,w,h);<br> f.setVisible(true);</p> <p> statusArea.setBorder(BorderFactory.createEtchedBorder());<br> statusArea.setLayout(new FlowLayout(FlowLayout.LEFT,0,0));<br> statusArea.add(status);<br> status.setHorizontalAlignment(JLabel.LEFT);</p> <p> f.setDefaultCloseOperation(indowConstants.DISPOSE_ON_CLOSE);</p> <p> f.addWindowListener(new WindowAdapter() {<br> public void windowClosed(WindowEvent e) {<br> System.exit(0);<br> }<br> });<br> }<br> static public JPanel getStatusArea() {<br> return statusArea;<br> }<br> static public void showStatus(String s) {<br> status.setText(s);<br> }<br> static String getResource(String key) {<br> return (resources == null) ? null : <br> resources.getString(key);<br> }<br> }</p> <p> 嚴格地說,GJApp是一個幫助類,它實現(xiàn)獨有的static方法。GJApp的實例不能實例化,這是GJApp private構(gòu)造方法強加的規(guī)定。<br> 一個static代碼塊(它在main()方法之前執(zhí)行)試圖獲得對GJApp.properties文件資源包的一個引用。在GJApp.getResource方法中使用這個資源包可以獲得一個與一個給定資源關(guān)鍵字相關(guān)的字符串。<br> GJApp.launch方法為傳送給它的窗體設(shè)置邊界和標題,把這個窗休的可見性設(shè)置為true,并打開這個窗體。這個launch方法還配置狀態(tài)區(qū)并把窗體的缺省關(guān)閉操作設(shè)置為WindowConstants.DISPOSE_ON_CLOSE。添加到這個窗體中的窗口監(jiān)聽器在窗口關(guān)閉時會退出該應(yīng)用程序。<br> GJApp類用getStatusArea方法訪問其狀態(tài)區(qū)面板。與小應(yīng)用程序一樣,GJApp類用showStatus方法來更新狀態(tài)區(qū)。<br> 注意:本書以后介紹的應(yīng)用程序都是在GJApp類幫助下實現(xiàn)的。但是,為了簡短些,例2-5是本書中唯一列出了GJApp類的地方。 </p> <p><b><a name="2.3"></a>2.3 混合使用Swing組件和AWT組件</b></p> <p> 原來的AWT只是為重量組件設(shè)計的;在AWT1.1版本發(fā)布前,還沒有輕量組件。結(jié)果,AWT不得不重做AWT,以提供輕量組件。<br> 任何軟件開發(fā)人員都可證實,把一個復(fù)雜的系統(tǒng)和以前未預(yù)見的設(shè)計組合起來不是一個簡單的任務(wù),把輕量組件合并到AWT中也不例外。直到現(xiàn)在,在一個小應(yīng)用程序或應(yīng)用程序中混用輕量組件和重量組件還是有許多問題,尤其是把重量組件嵌入輕量容器中時更是如此。</p> <p> <b><a name="2.3.1"></a>2.3.1 層序</b></p> <p> 組件的層序是同一容器中組件之間顯示的層次關(guān)系。<br> 如果容器是同類的(即它包含的組件都是輕量組件或都是重量組件),則按組件被添加到容器中的順序來確定其層序。第一個被添加到容器中的組件有最高的層序,即它在同一容器中所有其他組件的上面顯示。最后添加到容順中的組件的層序最低,即它在同一個容器中的所有其他組件的下面顯示。<br> 如果容器是異類的(即它既有輕量組件又有重量組件),則事情要稍微復(fù)雜些。從第1.2節(jié)“輕量組件與重量組件的比較”中,我們知道,輕量組件不是顯示在它們自己的窗口中,而是顯示在它們的重量容器的窗口中。所以,輕量組件的層序與重量容器的層序相同。如果多個輕量組件被添加到一個容器中,則這些輕量組件的層序是由組件被添加到容器中的順序來決定的。<br> 如果對此還不太明白,下面的兩個小應(yīng)用程序?qū)兄诶斫狻?lt;a href="s02_t05.htm" target="_blank">圖2-5</a>所示的小應(yīng)用程序有七個按鈕,其中四個是重量AWT按鈕,其他三個是Swing輕量按鈕。所有的重量按鈕都顯示在輕量按鈕的上面,因為輕量按鈕的層序與它們的容器的層序相同。<br> 例2-6列出了圖2-5所示的少應(yīng)用程序的代碼。</p> <p align="center"><b>例2-6 混合使用重量組件和輕量組件</b></p> <p> import javax.swing.*;<br> import java.awt.*;<br> import java.awt.event.*;</p> <p> public class Test extends JApplet {<br> Button b1, b2, b3, b4;<br> JButton jb1, jb2, jb3;</p> <p> public void init() {<br> Container contentPane = getContentPane();<br> contentPane.setLayout(null);</p> <p> // create heavyweight AWT buttons<br> b1 = new Button("Heavyweight Button #1");<br> b2 = new Button("Heavyweight Button #2");<br> b3 = new Button("Heavyweight Button #3");<br> b4 = new Button("Heavyweight Button #4");</p> <p> // create lightweight Swing buttons<br> jb1 = new JButton("Swing Button #1");<br> jb2 = new JButton("Swing Button #2");<br> jb3 = new JButton("Swing Button #3");</p> <p> // set bounds for heavyweight buttons<br> b1.setBounds(10, 10, 150, 25);<br> b2.setBounds(110, 25, 150, 25);<br> b3.setBounds(210, 40, 150, 25);<br> b4.setBounds(310, 55, 150, 25);</p> <p> // set bounds for lightweight buttons<br> jb1.setBounds(85, 25, 150, 65);<br> jb2.setBounds(100, 65, 150, 65);<br> jb3.setBounds(115, 105, 150, 65);</p> <p> // add lightweight buttons<br> contentPane.add(jb1);<br> contentPane.add(jb2);<br> contentPane.add(jb3);</p> <p> // add heavyweight buttons<br> contentPane.add(b1);<br> contentPane.add(b2);<br>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -