?? s02.htm
字號:
<p> <b><a name="2.1.3"></a>2.1.3 應用程序</b></p> <p> 例2-2所示的應用程序與例2-1所示的小應用程序在功能上是完成相同的。它們都把JLabel的一個實例添加到它們的根窗格的內容窗格中。<br> 例2-3列出了<a href="s02_t03.jar" target="_blank">圖2-3</a>所用的應用程序的代碼。</p> <p align="center"><b>例2-3 一個Swing應用程序</b></p> <p> import javax.swing.*;<br> import java.awt.*;<br> import java.awt.event.*;</p> <p> public class Test extends JFrame {<br> public Test() {<br> super("An Application");</p> <p> Container contentPane = getContentPane();<br> /*原文:<br> Icon icon = new ImageIcon("swing.gif", <br> "An animated GIF of Duke on a swing");</p> <p> JLabel label = new JLabel("Swing!", icon,<br> SwingConstants.CENTER);<br> ----*/ </p> <p> //修改成:<br> java.net.URL codebase=getClass().getResource("swing.gif");<br> JLabel label = new JLabel("Swing!",new ImageIcon(codebase), SwingConstants.CENTER); <br> //---<br> contentPane.add(label, BorderLayout.CENTER);<br> }<br> public static void main(String args[]) {<br> final JFrame f = new Test();</p> <p> f.setBounds(100,100,300,250);<br> f.setVisible(true);<br> f.setDefaultCloseOperation(DISPOSE_ON_CLOSE);</p> <p> f.addWindowListener(new WindowAdapter() {<br> public void windowClosed(WindowEvent e) {<br> System.exit(0);<br> }<br> });<br> }<br> }</p> <p> 應用程序比小應用程序要稍微復雜些,這是因為它們不是在瀏覽器內部運行的,即瀏覽器不啟動它們也不設置它們的大小。應用程序必須提供main方法,必須把一個窗體實例化,隨后確定該窗體的大小(注:可使用JFrame.pack()顯式地給出窗體的大小)并使該窗體可見。<br> 例2-2中的應用程序還設置窗體的缺省關閉操作并添加一個窗口監聽器,該監聽器在窗體被關閉后會退出這個應用程序。有關Swing窗體的缺省關閉操作的更多信息,請參見2.1.4節“JFrame類”。<br> Swing小應用程序和應用程序有許多共同點。它們都含有一個JRootPane實例,都必須把組件添加到根窗格的內容窗格中。而且,不能顯式地設置Swing小應用程序或Swing應用程序的布局管理器。 </p> <p> <b><a name="2.1.4"></a>2.1.4 JFrame類</b></p> <p> JFrame類擴展java.awt.Frame,與JApplet類似,它也實現Accessible接口和RootPaneCotainer接口。JFrame還實現Swing.WindowsConstants接口,該接口定義缺省關閉操作的常量。有關Swing常量的更多信息,請參見6.4節“Swing常量”。<br> JFrame實惠許多在JApplet中能找到的、相同的方法。與JApplet類似,為了不顯式地設置其布局管理器或不把組件直接添加到窗體中,JFrame重載setLayout和addImpl方法。JRame實現了所有在RootPaneContainer接口中定義的方法,還實現了通話和禁止根窗格檢查的方法。JFrame還實惠了確定當前是束啟用了根窗格檢查的方法。<br> 類總結2-2總結了JFrame類。</p> <p><br> <b>類總結2-2 JFrame</b></p> <p> 擴展:java.applet.Frame<br> 實現:javax.accessibility.Accessible、RootPaneContainer<br> 1.構造方法<br> public JFrame()<br> public JFrame(String title)<br> JFrame有兩個構造方法,一個構造方法不帶參數,一個構造方法以一個字符串為參數,該字符串代表窗體的標題。<br> 瀏覽器或小應用程序的閱讀器會調用Swing小應用程序的構造方法,因此,通常不需要開發人員編寫代碼來調用它的構造方法,但是,應用程序必須負責構造窗體并負責設置窗體的大小。通常為JFrame的實例選擇帶一個字符串的構造方法,不帶參數的構造方法將產生沒有標題的窗體。 <br> (1)與JApplet交疊的方法<br> protected void addImpl(Component,Object,int)<br> prrotected JRootPane createRootPane()<br> public AccessibleContext getAccessibleContext()<br> public Container getContentPane()<br> public Component getGlassPane()<br> public JMenuBar getMenuBar()<br> public JLayeredPane getLayeredPane()<br> public JRootPane getRootPane()<br> protected boolean isRootPaneCheckingEnabled()<br> protected void processKeyEvent(KeyEvent)<br> public void setContentPane(Container)<br> public void setGlassPane(Component)<br> public void setMenuBar(JMenu Bar)<br> public void setLayeredPanec(JlayeredPane)<br> public void setLayout(LayoutManager)<br> protected void setRootPane(JRootPane)<br> protected void setRootPaneCheckingEnabled(boolean)<br> public void update(Graphics)<br> 上面列出的JFrame方法與JApplet中定義的方法交疊。其中的大部分方法與JApplet中相應方法的實現方式是相同的。例如,如果允許根窗格檢查,則JFrame.setLayout和JFrame.addImpl都將彈出一個異常信息。<br> 有關上述方法的更多信息,請參見“類總結2-1JApplet”。<br> (2)窗體初始化/缺省的關閉操作/窗口事件 <br> protected void frameInit()<br> public int getDefaultCloseOperation()<br> protected void setDefaultCloseOperation(int)<br> protected void processWindowEvent(WindowEvent)<br> JFrame構造方法調用frameInit方法來初始化窗體。JFrame的frameInit()方法允許窗體的鍵盤事件和窗口事件,設置窗體的根窗格和背景色,并允許根窗格檢查。如果缺省的設置不令人滿意的話,也可擴展JFrame以重載frameInit()。</p> <p> 使用AWT窗體時,開發人要負責處理窗口關閉事件。通常,這需要重載事件處理方法,需要簡單地隱藏窗口或隱藏窗口并清除其本地資源。而Swing通過把一個缺省關閉操作與每一個JFrame實例相關聯來使窗口的關閉事件較容易處理??梢杂胹etDefaultCloseOperation方法來設置缺省的關閉操作,而且可以用getDefaultCloseOperation()來獲取缺省的關閉操作。可以傳送給setDefaultCloseOperation()的integer值在WindowConstants類中定義,表2-1,表2-1列出了integer值。</p> <p> <b>表2-1 WindowContants public常數</b><br> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br> <b>方法名 實現 </b><br> ─────────────────────────────────<br> DO_NOTHNG_ON_CLOSE 關閉窗口時什么也不做<br> HIDE_ON_CLOSE 關閉窗口隱藏該窗口<br> DISPOSE_ON_CLOSE 關閉窗口時隱藏該窗口并清除其本地資源 <br> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p> <p> 如果沒有顯式地設置JFrame的缺省關閉操作,則缺省值是DO_NOTHING_ON_CLOSE。<br> DISPOSE_ON_CLOSE隱藏窗體并清除與這個窗體有關的系統資源。如果該窗體是應用程序窗體,則在該窗體清除后,應用程序將繼續運行。例如,例2-2所列的應用程序把應用程序窗體的缺省關閉操作設置為DISPOSE_ON_CLOSE,但是,應用程序仍然負責處理窗體關閉事件。到應用程序得到窗體已關閉(當調用windowClosed方法時)窗體已隱藏并清除通知時,應用程序仍在運行;結果,應用程序在windowClosed方法中調用System.exit()。</p> <p> <b><a name="2.1.5"></a>2.1.5 小應用程序/應用程序的組合</b></p> <p> 有時需要實現這樣一個源文件,它既可作為應用程序運行又可作為小應用程序運行。例2-3示出了一種實現小應用程序/應用程序組合的方法。</p> <p align="center"><b>例2-3 Swing小應用程序/應用程序組合</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> /*原文<br> Icon icon = new ImageIcon("swing.gif");<br> JLabel label = new JLabel(icon);<br> */<br> //原文如不修改,不能正常顯示圖標 </p> <p> //修改后--------<br> java.net.URL codebase=getClass().getResource("swing.gif");<br> JLabel label = new JLabel(new ImageIcon(codebase));<br> //----------修改后的程序有個毛病,既作為applet使用時,不能刷新,一旦刷新圖就沒了。</p> <p> contentPane.setLayout(new FlowLayout()); <br> contentPane.add(label);</p> <p> //contentPane.add(label);<br> }<br> public static void main(String args[]) {<br> final JFrame f = new JFrame();<br> JApplet applet = new Test();</p> <p> applet.init();</p> <p> f.setContentPane(applet.getContentPane());<br> f.setBounds(100,100,308,199);<br> f.setTitle("An Application");<br> f.setVisible(true);</p> <p> f.setDefaultCloseOperation(<br> WindowConstants.DISPOSE_ON_CLOSE);</p> <p> f.addWindowListener(new WindowAdapter() {<br> public void windowClosed(WindowEvent e) {<br> System.exit(0);<br> }<br> });<br> }<br>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -